Merge tag 'for-linus-4.20a-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / drivers / scsi / mvumi.c
1 /*
2  * Marvell UMI driver
3  *
4  * Copyright 2011 Marvell. <jyli@marvell.com>
5  *
6  * This file is licensed under GPLv2.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; version 2 of the
11  * License.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21  * USA
22 */
23
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/init.h>
28 #include <linux/device.h>
29 #include <linux/pci.h>
30 #include <linux/list.h>
31 #include <linux/spinlock.h>
32 #include <linux/interrupt.h>
33 #include <linux/delay.h>
34 #include <linux/ktime.h>
35 #include <linux/blkdev.h>
36 #include <linux/io.h>
37 #include <scsi/scsi.h>
38 #include <scsi/scsi_cmnd.h>
39 #include <scsi/scsi_device.h>
40 #include <scsi/scsi_host.h>
41 #include <scsi/scsi_transport.h>
42 #include <scsi/scsi_eh.h>
43 #include <linux/uaccess.h>
44 #include <linux/kthread.h>
45
46 #include "mvumi.h"
47
48 MODULE_LICENSE("GPL");
49 MODULE_AUTHOR("jyli@marvell.com");
50 MODULE_DESCRIPTION("Marvell UMI Driver");
51
52 static const struct pci_device_id mvumi_pci_table[] = {
53         { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, PCI_DEVICE_ID_MARVELL_MV9143) },
54         { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, PCI_DEVICE_ID_MARVELL_MV9580) },
55         { 0 }
56 };
57
58 MODULE_DEVICE_TABLE(pci, mvumi_pci_table);
59
60 static void tag_init(struct mvumi_tag *st, unsigned short size)
61 {
62         unsigned short i;
63         BUG_ON(size != st->size);
64         st->top = size;
65         for (i = 0; i < size; i++)
66                 st->stack[i] = size - 1 - i;
67 }
68
69 static unsigned short tag_get_one(struct mvumi_hba *mhba, struct mvumi_tag *st)
70 {
71         BUG_ON(st->top <= 0);
72         return st->stack[--st->top];
73 }
74
75 static void tag_release_one(struct mvumi_hba *mhba, struct mvumi_tag *st,
76                                                         unsigned short tag)
77 {
78         BUG_ON(st->top >= st->size);
79         st->stack[st->top++] = tag;
80 }
81
82 static bool tag_is_empty(struct mvumi_tag *st)
83 {
84         if (st->top == 0)
85                 return 1;
86         else
87                 return 0;
88 }
89
90 static void mvumi_unmap_pci_addr(struct pci_dev *dev, void **addr_array)
91 {
92         int i;
93
94         for (i = 0; i < MAX_BASE_ADDRESS; i++)
95                 if ((pci_resource_flags(dev, i) & IORESOURCE_MEM) &&
96                                                                 addr_array[i])
97                         pci_iounmap(dev, addr_array[i]);
98 }
99
100 static int mvumi_map_pci_addr(struct pci_dev *dev, void **addr_array)
101 {
102         int i;
103
104         for (i = 0; i < MAX_BASE_ADDRESS; i++) {
105                 if (pci_resource_flags(dev, i) & IORESOURCE_MEM) {
106                         addr_array[i] = pci_iomap(dev, i, 0);
107                         if (!addr_array[i]) {
108                                 dev_err(&dev->dev, "failed to map Bar[%d]\n",
109                                                                         i);
110                                 mvumi_unmap_pci_addr(dev, addr_array);
111                                 return -ENOMEM;
112                         }
113                 } else
114                         addr_array[i] = NULL;
115
116                 dev_dbg(&dev->dev, "Bar %d : %p.\n", i, addr_array[i]);
117         }
118
119         return 0;
120 }
121
122 static struct mvumi_res *mvumi_alloc_mem_resource(struct mvumi_hba *mhba,
123                                 enum resource_type type, unsigned int size)
124 {
125         struct mvumi_res *res = kzalloc(sizeof(*res), GFP_ATOMIC);
126
127         if (!res) {
128                 dev_err(&mhba->pdev->dev,
129                         "Failed to allocate memory for resource manager.\n");
130                 return NULL;
131         }
132
133         switch (type) {
134         case RESOURCE_CACHED_MEMORY:
135                 res->virt_addr = kzalloc(size, GFP_ATOMIC);
136                 if (!res->virt_addr) {
137                         dev_err(&mhba->pdev->dev,
138                                 "unable to allocate memory,size = %d.\n", size);
139                         kfree(res);
140                         return NULL;
141                 }
142                 break;
143
144         case RESOURCE_UNCACHED_MEMORY:
145                 size = round_up(size, 8);
146                 res->virt_addr = dma_zalloc_coherent(&mhba->pdev->dev, size,
147                                 &res->bus_addr, GFP_KERNEL);
148                 if (!res->virt_addr) {
149                         dev_err(&mhba->pdev->dev,
150                                         "unable to allocate consistent mem,"
151                                                         "size = %d.\n", size);
152                         kfree(res);
153                         return NULL;
154                 }
155                 break;
156
157         default:
158                 dev_err(&mhba->pdev->dev, "unknown resource type %d.\n", type);
159                 kfree(res);
160                 return NULL;
161         }
162
163         res->type = type;
164         res->size = size;
165         INIT_LIST_HEAD(&res->entry);
166         list_add_tail(&res->entry, &mhba->res_list);
167
168         return res;
169 }
170
171 static void mvumi_release_mem_resource(struct mvumi_hba *mhba)
172 {
173         struct mvumi_res *res, *tmp;
174
175         list_for_each_entry_safe(res, tmp, &mhba->res_list, entry) {
176                 switch (res->type) {
177                 case RESOURCE_UNCACHED_MEMORY:
178                         dma_free_coherent(&mhba->pdev->dev, res->size,
179                                                 res->virt_addr, res->bus_addr);
180                         break;
181                 case RESOURCE_CACHED_MEMORY:
182                         kfree(res->virt_addr);
183                         break;
184                 default:
185                         dev_err(&mhba->pdev->dev,
186                                 "unknown resource type %d\n", res->type);
187                         break;
188                 }
189                 list_del(&res->entry);
190                 kfree(res);
191         }
192         mhba->fw_flag &= ~MVUMI_FW_ALLOC;
193 }
194
195 /**
196  * mvumi_make_sgl -     Prepares  SGL
197  * @mhba:               Adapter soft state
198  * @scmd:               SCSI command from the mid-layer
199  * @sgl_p:              SGL to be filled in
200  * @sg_count            return the number of SG elements
201  *
202  * If successful, this function returns 0. otherwise, it returns -1.
203  */
204 static int mvumi_make_sgl(struct mvumi_hba *mhba, struct scsi_cmnd *scmd,
205                                         void *sgl_p, unsigned char *sg_count)
206 {
207         struct scatterlist *sg;
208         struct mvumi_sgl *m_sg = (struct mvumi_sgl *) sgl_p;
209         unsigned int i;
210         unsigned int sgnum = scsi_sg_count(scmd);
211         dma_addr_t busaddr;
212
213         sg = scsi_sglist(scmd);
214         *sg_count = dma_map_sg(&mhba->pdev->dev, sg, sgnum,
215                                scmd->sc_data_direction);
216         if (*sg_count > mhba->max_sge) {
217                 dev_err(&mhba->pdev->dev,
218                         "sg count[0x%x] is bigger than max sg[0x%x].\n",
219                         *sg_count, mhba->max_sge);
220                 dma_unmap_sg(&mhba->pdev->dev, sg, sgnum,
221                              scmd->sc_data_direction);
222                 return -1;
223         }
224         for (i = 0; i < *sg_count; i++) {
225                 busaddr = sg_dma_address(&sg[i]);
226                 m_sg->baseaddr_l = cpu_to_le32(lower_32_bits(busaddr));
227                 m_sg->baseaddr_h = cpu_to_le32(upper_32_bits(busaddr));
228                 m_sg->flags = 0;
229                 sgd_setsz(mhba, m_sg, cpu_to_le32(sg_dma_len(&sg[i])));
230                 if ((i + 1) == *sg_count)
231                         m_sg->flags |= 1U << mhba->eot_flag;
232
233                 sgd_inc(mhba, m_sg);
234         }
235
236         return 0;
237 }
238
239 static int mvumi_internal_cmd_sgl(struct mvumi_hba *mhba, struct mvumi_cmd *cmd,
240                                                         unsigned int size)
241 {
242         struct mvumi_sgl *m_sg;
243         void *virt_addr;
244         dma_addr_t phy_addr;
245
246         if (size == 0)
247                 return 0;
248
249         virt_addr = dma_zalloc_coherent(&mhba->pdev->dev, size, &phy_addr,
250                         GFP_KERNEL);
251         if (!virt_addr)
252                 return -1;
253
254         m_sg = (struct mvumi_sgl *) &cmd->frame->payload[0];
255         cmd->frame->sg_counts = 1;
256         cmd->data_buf = virt_addr;
257
258         m_sg->baseaddr_l = cpu_to_le32(lower_32_bits(phy_addr));
259         m_sg->baseaddr_h = cpu_to_le32(upper_32_bits(phy_addr));
260         m_sg->flags = 1U << mhba->eot_flag;
261         sgd_setsz(mhba, m_sg, cpu_to_le32(size));
262
263         return 0;
264 }
265
266 static struct mvumi_cmd *mvumi_create_internal_cmd(struct mvumi_hba *mhba,
267                                 unsigned int buf_size)
268 {
269         struct mvumi_cmd *cmd;
270
271         cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
272         if (!cmd) {
273                 dev_err(&mhba->pdev->dev, "failed to create a internal cmd\n");
274                 return NULL;
275         }
276         INIT_LIST_HEAD(&cmd->queue_pointer);
277
278         cmd->frame = dma_alloc_coherent(&mhba->pdev->dev, mhba->ib_max_size,
279                         &cmd->frame_phys, GFP_KERNEL);
280         if (!cmd->frame) {
281                 dev_err(&mhba->pdev->dev, "failed to allocate memory for FW"
282                         " frame,size = %d.\n", mhba->ib_max_size);
283                 kfree(cmd);
284                 return NULL;
285         }
286
287         if (buf_size) {
288                 if (mvumi_internal_cmd_sgl(mhba, cmd, buf_size)) {
289                         dev_err(&mhba->pdev->dev, "failed to allocate memory"
290                                                 " for internal frame\n");
291                         dma_free_coherent(&mhba->pdev->dev, mhba->ib_max_size,
292                                         cmd->frame, cmd->frame_phys);
293                         kfree(cmd);
294                         return NULL;
295                 }
296         } else
297                 cmd->frame->sg_counts = 0;
298
299         return cmd;
300 }
301
302 static void mvumi_delete_internal_cmd(struct mvumi_hba *mhba,
303                                                 struct mvumi_cmd *cmd)
304 {
305         struct mvumi_sgl *m_sg;
306         unsigned int size;
307         dma_addr_t phy_addr;
308
309         if (cmd && cmd->frame) {
310                 if (cmd->frame->sg_counts) {
311                         m_sg = (struct mvumi_sgl *) &cmd->frame->payload[0];
312                         sgd_getsz(mhba, m_sg, size);
313
314                         phy_addr = (dma_addr_t) m_sg->baseaddr_l |
315                                 (dma_addr_t) ((m_sg->baseaddr_h << 16) << 16);
316
317                         dma_free_coherent(&mhba->pdev->dev, size, cmd->data_buf,
318                                                                 phy_addr);
319                 }
320                 dma_free_coherent(&mhba->pdev->dev, mhba->ib_max_size,
321                                 cmd->frame, cmd->frame_phys);
322                 kfree(cmd);
323         }
324 }
325
326 /**
327  * mvumi_get_cmd -      Get a command from the free pool
328  * @mhba:               Adapter soft state
329  *
330  * Returns a free command from the pool
331  */
332 static struct mvumi_cmd *mvumi_get_cmd(struct mvumi_hba *mhba)
333 {
334         struct mvumi_cmd *cmd = NULL;
335
336         if (likely(!list_empty(&mhba->cmd_pool))) {
337                 cmd = list_entry((&mhba->cmd_pool)->next,
338                                 struct mvumi_cmd, queue_pointer);
339                 list_del_init(&cmd->queue_pointer);
340         } else
341                 dev_warn(&mhba->pdev->dev, "command pool is empty!\n");
342
343         return cmd;
344 }
345
346 /**
347  * mvumi_return_cmd -   Return a cmd to free command pool
348  * @mhba:               Adapter soft state
349  * @cmd:                Command packet to be returned to free command pool
350  */
351 static inline void mvumi_return_cmd(struct mvumi_hba *mhba,
352                                                 struct mvumi_cmd *cmd)
353 {
354         cmd->scmd = NULL;
355         list_add_tail(&cmd->queue_pointer, &mhba->cmd_pool);
356 }
357
358 /**
359  * mvumi_free_cmds -    Free all the cmds in the free cmd pool
360  * @mhba:               Adapter soft state
361  */
362 static void mvumi_free_cmds(struct mvumi_hba *mhba)
363 {
364         struct mvumi_cmd *cmd;
365
366         while (!list_empty(&mhba->cmd_pool)) {
367                 cmd = list_first_entry(&mhba->cmd_pool, struct mvumi_cmd,
368                                                         queue_pointer);
369                 list_del(&cmd->queue_pointer);
370                 if (!(mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC))
371                         kfree(cmd->frame);
372                 kfree(cmd);
373         }
374 }
375
376 /**
377  * mvumi_alloc_cmds -   Allocates the command packets
378  * @mhba:               Adapter soft state
379  *
380  */
381 static int mvumi_alloc_cmds(struct mvumi_hba *mhba)
382 {
383         int i;
384         struct mvumi_cmd *cmd;
385
386         for (i = 0; i < mhba->max_io; i++) {
387                 cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
388                 if (!cmd)
389                         goto err_exit;
390
391                 INIT_LIST_HEAD(&cmd->queue_pointer);
392                 list_add_tail(&cmd->queue_pointer, &mhba->cmd_pool);
393                 if (mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC) {
394                         cmd->frame = mhba->ib_frame + i * mhba->ib_max_size;
395                         cmd->frame_phys = mhba->ib_frame_phys
396                                                 + i * mhba->ib_max_size;
397                 } else
398                         cmd->frame = kzalloc(mhba->ib_max_size, GFP_KERNEL);
399                 if (!cmd->frame)
400                         goto err_exit;
401         }
402         return 0;
403
404 err_exit:
405         dev_err(&mhba->pdev->dev,
406                         "failed to allocate memory for cmd[0x%x].\n", i);
407         while (!list_empty(&mhba->cmd_pool)) {
408                 cmd = list_first_entry(&mhba->cmd_pool, struct mvumi_cmd,
409                                                 queue_pointer);
410                 list_del(&cmd->queue_pointer);
411                 if (!(mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC))
412                         kfree(cmd->frame);
413                 kfree(cmd);
414         }
415         return -ENOMEM;
416 }
417
418 static unsigned int mvumi_check_ib_list_9143(struct mvumi_hba *mhba)
419 {
420         unsigned int ib_rp_reg;
421         struct mvumi_hw_regs *regs = mhba->regs;
422
423         ib_rp_reg = ioread32(mhba->regs->inb_read_pointer);
424
425         if (unlikely(((ib_rp_reg & regs->cl_slot_num_mask) ==
426                         (mhba->ib_cur_slot & regs->cl_slot_num_mask)) &&
427                         ((ib_rp_reg & regs->cl_pointer_toggle)
428                          != (mhba->ib_cur_slot & regs->cl_pointer_toggle)))) {
429                 dev_warn(&mhba->pdev->dev, "no free slot to use.\n");
430                 return 0;
431         }
432         if (atomic_read(&mhba->fw_outstanding) >= mhba->max_io) {
433                 dev_warn(&mhba->pdev->dev, "firmware io overflow.\n");
434                 return 0;
435         } else {
436                 return mhba->max_io - atomic_read(&mhba->fw_outstanding);
437         }
438 }
439
440 static unsigned int mvumi_check_ib_list_9580(struct mvumi_hba *mhba)
441 {
442         unsigned int count;
443         if (atomic_read(&mhba->fw_outstanding) >= (mhba->max_io - 1))
444                 return 0;
445         count = ioread32(mhba->ib_shadow);
446         if (count == 0xffff)
447                 return 0;
448         return count;
449 }
450
451 static void mvumi_get_ib_list_entry(struct mvumi_hba *mhba, void **ib_entry)
452 {
453         unsigned int cur_ib_entry;
454
455         cur_ib_entry = mhba->ib_cur_slot & mhba->regs->cl_slot_num_mask;
456         cur_ib_entry++;
457         if (cur_ib_entry >= mhba->list_num_io) {
458                 cur_ib_entry -= mhba->list_num_io;
459                 mhba->ib_cur_slot ^= mhba->regs->cl_pointer_toggle;
460         }
461         mhba->ib_cur_slot &= ~mhba->regs->cl_slot_num_mask;
462         mhba->ib_cur_slot |= (cur_ib_entry & mhba->regs->cl_slot_num_mask);
463         if (mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC) {
464                 *ib_entry = mhba->ib_list + cur_ib_entry *
465                                 sizeof(struct mvumi_dyn_list_entry);
466         } else {
467                 *ib_entry = mhba->ib_list + cur_ib_entry * mhba->ib_max_size;
468         }
469         atomic_inc(&mhba->fw_outstanding);
470 }
471
472 static void mvumi_send_ib_list_entry(struct mvumi_hba *mhba)
473 {
474         iowrite32(0xffff, mhba->ib_shadow);
475         iowrite32(mhba->ib_cur_slot, mhba->regs->inb_write_pointer);
476 }
477
478 static char mvumi_check_ob_frame(struct mvumi_hba *mhba,
479                 unsigned int cur_obf, struct mvumi_rsp_frame *p_outb_frame)
480 {
481         unsigned short tag, request_id;
482
483         udelay(1);
484         p_outb_frame = mhba->ob_list + cur_obf * mhba->ob_max_size;
485         request_id = p_outb_frame->request_id;
486         tag = p_outb_frame->tag;
487         if (tag > mhba->tag_pool.size) {
488                 dev_err(&mhba->pdev->dev, "ob frame data error\n");
489                 return -1;
490         }
491         if (mhba->tag_cmd[tag] == NULL) {
492                 dev_err(&mhba->pdev->dev, "tag[0x%x] with NO command\n", tag);
493                 return -1;
494         } else if (mhba->tag_cmd[tag]->request_id != request_id &&
495                                                 mhba->request_id_enabled) {
496                         dev_err(&mhba->pdev->dev, "request ID from FW:0x%x,"
497                                         "cmd request ID:0x%x\n", request_id,
498                                         mhba->tag_cmd[tag]->request_id);
499                         return -1;
500         }
501
502         return 0;
503 }
504
505 static int mvumi_check_ob_list_9143(struct mvumi_hba *mhba,
506                         unsigned int *cur_obf, unsigned int *assign_obf_end)
507 {
508         unsigned int ob_write, ob_write_shadow;
509         struct mvumi_hw_regs *regs = mhba->regs;
510
511         do {
512                 ob_write = ioread32(regs->outb_copy_pointer);
513                 ob_write_shadow = ioread32(mhba->ob_shadow);
514         } while ((ob_write & regs->cl_slot_num_mask) != ob_write_shadow);
515
516         *cur_obf = mhba->ob_cur_slot & mhba->regs->cl_slot_num_mask;
517         *assign_obf_end = ob_write & mhba->regs->cl_slot_num_mask;
518
519         if ((ob_write & regs->cl_pointer_toggle) !=
520                         (mhba->ob_cur_slot & regs->cl_pointer_toggle)) {
521                 *assign_obf_end += mhba->list_num_io;
522         }
523         return 0;
524 }
525
526 static int mvumi_check_ob_list_9580(struct mvumi_hba *mhba,
527                         unsigned int *cur_obf, unsigned int *assign_obf_end)
528 {
529         unsigned int ob_write;
530         struct mvumi_hw_regs *regs = mhba->regs;
531
532         ob_write = ioread32(regs->outb_read_pointer);
533         ob_write = ioread32(regs->outb_copy_pointer);
534         *cur_obf = mhba->ob_cur_slot & mhba->regs->cl_slot_num_mask;
535         *assign_obf_end = ob_write & mhba->regs->cl_slot_num_mask;
536         if (*assign_obf_end < *cur_obf)
537                 *assign_obf_end += mhba->list_num_io;
538         else if (*assign_obf_end == *cur_obf)
539                 return -1;
540         return 0;
541 }
542
543 static void mvumi_receive_ob_list_entry(struct mvumi_hba *mhba)
544 {
545         unsigned int cur_obf, assign_obf_end, i;
546         struct mvumi_ob_data *ob_data;
547         struct mvumi_rsp_frame *p_outb_frame;
548         struct mvumi_hw_regs *regs = mhba->regs;
549
550         if (mhba->instancet->check_ob_list(mhba, &cur_obf, &assign_obf_end))
551                 return;
552
553         for (i = (assign_obf_end - cur_obf); i != 0; i--) {
554                 cur_obf++;
555                 if (cur_obf >= mhba->list_num_io) {
556                         cur_obf -= mhba->list_num_io;
557                         mhba->ob_cur_slot ^= regs->cl_pointer_toggle;
558                 }
559
560                 p_outb_frame = mhba->ob_list + cur_obf * mhba->ob_max_size;
561
562                 /* Copy pointer may point to entry in outbound list
563                 *  before entry has valid data
564                 */
565                 if (unlikely(p_outb_frame->tag > mhba->tag_pool.size ||
566                         mhba->tag_cmd[p_outb_frame->tag] == NULL ||
567                         p_outb_frame->request_id !=
568                                 mhba->tag_cmd[p_outb_frame->tag]->request_id))
569                         if (mvumi_check_ob_frame(mhba, cur_obf, p_outb_frame))
570                                 continue;
571
572                 if (!list_empty(&mhba->ob_data_list)) {
573                         ob_data = (struct mvumi_ob_data *)
574                                 list_first_entry(&mhba->ob_data_list,
575                                         struct mvumi_ob_data, list);
576                         list_del_init(&ob_data->list);
577                 } else {
578                         ob_data = NULL;
579                         if (cur_obf == 0) {
580                                 cur_obf = mhba->list_num_io - 1;
581                                 mhba->ob_cur_slot ^= regs->cl_pointer_toggle;
582                         } else
583                                 cur_obf -= 1;
584                         break;
585                 }
586
587                 memcpy(ob_data->data, p_outb_frame, mhba->ob_max_size);
588                 p_outb_frame->tag = 0xff;
589
590                 list_add_tail(&ob_data->list, &mhba->free_ob_list);
591         }
592         mhba->ob_cur_slot &= ~regs->cl_slot_num_mask;
593         mhba->ob_cur_slot |= (cur_obf & regs->cl_slot_num_mask);
594         iowrite32(mhba->ob_cur_slot, regs->outb_read_pointer);
595 }
596
597 static void mvumi_reset(struct mvumi_hba *mhba)
598 {
599         struct mvumi_hw_regs *regs = mhba->regs;
600
601         iowrite32(0, regs->enpointa_mask_reg);
602         if (ioread32(regs->arm_to_pciea_msg1) != HANDSHAKE_DONESTATE)
603                 return;
604
605         iowrite32(DRBL_SOFT_RESET, regs->pciea_to_arm_drbl_reg);
606 }
607
608 static unsigned char mvumi_start(struct mvumi_hba *mhba);
609
610 static int mvumi_wait_for_outstanding(struct mvumi_hba *mhba)
611 {
612         mhba->fw_state = FW_STATE_ABORT;
613         mvumi_reset(mhba);
614
615         if (mvumi_start(mhba))
616                 return FAILED;
617         else
618                 return SUCCESS;
619 }
620
621 static int mvumi_wait_for_fw(struct mvumi_hba *mhba)
622 {
623         struct mvumi_hw_regs *regs = mhba->regs;
624         u32 tmp;
625         unsigned long before;
626         before = jiffies;
627
628         iowrite32(0, regs->enpointa_mask_reg);
629         tmp = ioread32(regs->arm_to_pciea_msg1);
630         while (tmp != HANDSHAKE_READYSTATE) {
631                 iowrite32(DRBL_MU_RESET, regs->pciea_to_arm_drbl_reg);
632                 if (time_after(jiffies, before + FW_MAX_DELAY * HZ)) {
633                         dev_err(&mhba->pdev->dev,
634                                 "FW reset failed [0x%x].\n", tmp);
635                         return FAILED;
636                 }
637
638                 msleep(500);
639                 rmb();
640                 tmp = ioread32(regs->arm_to_pciea_msg1);
641         }
642
643         return SUCCESS;
644 }
645
646 static void mvumi_backup_bar_addr(struct mvumi_hba *mhba)
647 {
648         unsigned char i;
649
650         for (i = 0; i < MAX_BASE_ADDRESS; i++) {
651                 pci_read_config_dword(mhba->pdev, 0x10 + i * 4,
652                                                 &mhba->pci_base[i]);
653         }
654 }
655
656 static void mvumi_restore_bar_addr(struct mvumi_hba *mhba)
657 {
658         unsigned char i;
659
660         for (i = 0; i < MAX_BASE_ADDRESS; i++) {
661                 if (mhba->pci_base[i])
662                         pci_write_config_dword(mhba->pdev, 0x10 + i * 4,
663                                                 mhba->pci_base[i]);
664         }
665 }
666
667 static int mvumi_pci_set_master(struct pci_dev *pdev)
668 {
669         int ret = 0;
670
671         pci_set_master(pdev);
672
673         if (IS_DMA64) {
674                 if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)))
675                         ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
676         } else
677                 ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
678
679         return ret;
680 }
681
682 static int mvumi_reset_host_9580(struct mvumi_hba *mhba)
683 {
684         mhba->fw_state = FW_STATE_ABORT;
685
686         iowrite32(0, mhba->regs->reset_enable);
687         iowrite32(0xf, mhba->regs->reset_request);
688
689         iowrite32(0x10, mhba->regs->reset_enable);
690         iowrite32(0x10, mhba->regs->reset_request);
691         msleep(100);
692         pci_disable_device(mhba->pdev);
693
694         if (pci_enable_device(mhba->pdev)) {
695                 dev_err(&mhba->pdev->dev, "enable device failed\n");
696                 return FAILED;
697         }
698         if (mvumi_pci_set_master(mhba->pdev)) {
699                 dev_err(&mhba->pdev->dev, "set master failed\n");
700                 return FAILED;
701         }
702         mvumi_restore_bar_addr(mhba);
703         if (mvumi_wait_for_fw(mhba) == FAILED)
704                 return FAILED;
705
706         return mvumi_wait_for_outstanding(mhba);
707 }
708
709 static int mvumi_reset_host_9143(struct mvumi_hba *mhba)
710 {
711         return mvumi_wait_for_outstanding(mhba);
712 }
713
714 static int mvumi_host_reset(struct scsi_cmnd *scmd)
715 {
716         struct mvumi_hba *mhba;
717
718         mhba = (struct mvumi_hba *) scmd->device->host->hostdata;
719
720         scmd_printk(KERN_NOTICE, scmd, "RESET -%ld cmd=%x retries=%x\n",
721                         scmd->serial_number, scmd->cmnd[0], scmd->retries);
722
723         return mhba->instancet->reset_host(mhba);
724 }
725
726 static int mvumi_issue_blocked_cmd(struct mvumi_hba *mhba,
727                                                 struct mvumi_cmd *cmd)
728 {
729         unsigned long flags;
730
731         cmd->cmd_status = REQ_STATUS_PENDING;
732
733         if (atomic_read(&cmd->sync_cmd)) {
734                 dev_err(&mhba->pdev->dev,
735                         "last blocked cmd not finished, sync_cmd = %d\n",
736                                                 atomic_read(&cmd->sync_cmd));
737                 BUG_ON(1);
738                 return -1;
739         }
740         atomic_inc(&cmd->sync_cmd);
741         spin_lock_irqsave(mhba->shost->host_lock, flags);
742         mhba->instancet->fire_cmd(mhba, cmd);
743         spin_unlock_irqrestore(mhba->shost->host_lock, flags);
744
745         wait_event_timeout(mhba->int_cmd_wait_q,
746                 (cmd->cmd_status != REQ_STATUS_PENDING),
747                 MVUMI_INTERNAL_CMD_WAIT_TIME * HZ);
748
749         /* command timeout */
750         if (atomic_read(&cmd->sync_cmd)) {
751                 spin_lock_irqsave(mhba->shost->host_lock, flags);
752                 atomic_dec(&cmd->sync_cmd);
753                 if (mhba->tag_cmd[cmd->frame->tag]) {
754                         mhba->tag_cmd[cmd->frame->tag] = 0;
755                         dev_warn(&mhba->pdev->dev, "TIMEOUT:release tag [%d]\n",
756                                                         cmd->frame->tag);
757                         tag_release_one(mhba, &mhba->tag_pool, cmd->frame->tag);
758                 }
759                 if (!list_empty(&cmd->queue_pointer)) {
760                         dev_warn(&mhba->pdev->dev,
761                                 "TIMEOUT:A internal command doesn't send!\n");
762                         list_del_init(&cmd->queue_pointer);
763                 } else
764                         atomic_dec(&mhba->fw_outstanding);
765
766                 spin_unlock_irqrestore(mhba->shost->host_lock, flags);
767         }
768         return 0;
769 }
770
771 static void mvumi_release_fw(struct mvumi_hba *mhba)
772 {
773         mvumi_free_cmds(mhba);
774         mvumi_release_mem_resource(mhba);
775         mvumi_unmap_pci_addr(mhba->pdev, mhba->base_addr);
776         dma_free_coherent(&mhba->pdev->dev, HSP_MAX_SIZE,
777                 mhba->handshake_page, mhba->handshake_page_phys);
778         kfree(mhba->regs);
779         pci_release_regions(mhba->pdev);
780 }
781
782 static unsigned char mvumi_flush_cache(struct mvumi_hba *mhba)
783 {
784         struct mvumi_cmd *cmd;
785         struct mvumi_msg_frame *frame;
786         unsigned char device_id, retry = 0;
787         unsigned char bitcount = sizeof(unsigned char) * 8;
788
789         for (device_id = 0; device_id < mhba->max_target_id; device_id++) {
790                 if (!(mhba->target_map[device_id / bitcount] &
791                                 (1 << (device_id % bitcount))))
792                         continue;
793 get_cmd:        cmd = mvumi_create_internal_cmd(mhba, 0);
794                 if (!cmd) {
795                         if (retry++ >= 5) {
796                                 dev_err(&mhba->pdev->dev, "failed to get memory"
797                                         " for internal flush cache cmd for "
798                                         "device %d", device_id);
799                                 retry = 0;
800                                 continue;
801                         } else
802                                 goto get_cmd;
803                 }
804                 cmd->scmd = NULL;
805                 cmd->cmd_status = REQ_STATUS_PENDING;
806                 atomic_set(&cmd->sync_cmd, 0);
807                 frame = cmd->frame;
808                 frame->req_function = CL_FUN_SCSI_CMD;
809                 frame->device_id = device_id;
810                 frame->cmd_flag = CMD_FLAG_NON_DATA;
811                 frame->data_transfer_length = 0;
812                 frame->cdb_length = MAX_COMMAND_SIZE;
813                 memset(frame->cdb, 0, MAX_COMMAND_SIZE);
814                 frame->cdb[0] = SCSI_CMD_MARVELL_SPECIFIC;
815                 frame->cdb[1] = CDB_CORE_MODULE;
816                 frame->cdb[2] = CDB_CORE_SHUTDOWN;
817
818                 mvumi_issue_blocked_cmd(mhba, cmd);
819                 if (cmd->cmd_status != SAM_STAT_GOOD) {
820                         dev_err(&mhba->pdev->dev,
821                                 "device %d flush cache failed, status=0x%x.\n",
822                                 device_id, cmd->cmd_status);
823                 }
824
825                 mvumi_delete_internal_cmd(mhba, cmd);
826         }
827         return 0;
828 }
829
830 static unsigned char
831 mvumi_calculate_checksum(struct mvumi_hs_header *p_header,
832                                                         unsigned short len)
833 {
834         unsigned char *ptr;
835         unsigned char ret = 0, i;
836
837         ptr = (unsigned char *) p_header->frame_content;
838         for (i = 0; i < len; i++) {
839                 ret ^= *ptr;
840                 ptr++;
841         }
842
843         return ret;
844 }
845
846 static void mvumi_hs_build_page(struct mvumi_hba *mhba,
847                                 struct mvumi_hs_header *hs_header)
848 {
849         struct mvumi_hs_page2 *hs_page2;
850         struct mvumi_hs_page4 *hs_page4;
851         struct mvumi_hs_page3 *hs_page3;
852         u64 time;
853         u64 local_time;
854
855         switch (hs_header->page_code) {
856         case HS_PAGE_HOST_INFO:
857                 hs_page2 = (struct mvumi_hs_page2 *) hs_header;
858                 hs_header->frame_length = sizeof(*hs_page2) - 4;
859                 memset(hs_header->frame_content, 0, hs_header->frame_length);
860                 hs_page2->host_type = 3; /* 3 mean linux*/
861                 if (mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC)
862                         hs_page2->host_cap = 0x08;/* host dynamic source mode */
863                 hs_page2->host_ver.ver_major = VER_MAJOR;
864                 hs_page2->host_ver.ver_minor = VER_MINOR;
865                 hs_page2->host_ver.ver_oem = VER_OEM;
866                 hs_page2->host_ver.ver_build = VER_BUILD;
867                 hs_page2->system_io_bus = 0;
868                 hs_page2->slot_number = 0;
869                 hs_page2->intr_level = 0;
870                 hs_page2->intr_vector = 0;
871                 time = ktime_get_real_seconds();
872                 local_time = (time - (sys_tz.tz_minuteswest * 60));
873                 hs_page2->seconds_since1970 = local_time;
874                 hs_header->checksum = mvumi_calculate_checksum(hs_header,
875                                                 hs_header->frame_length);
876                 break;
877
878         case HS_PAGE_FIRM_CTL:
879                 hs_page3 = (struct mvumi_hs_page3 *) hs_header;
880                 hs_header->frame_length = sizeof(*hs_page3) - 4;
881                 memset(hs_header->frame_content, 0, hs_header->frame_length);
882                 hs_header->checksum = mvumi_calculate_checksum(hs_header,
883                                                 hs_header->frame_length);
884                 break;
885
886         case HS_PAGE_CL_INFO:
887                 hs_page4 = (struct mvumi_hs_page4 *) hs_header;
888                 hs_header->frame_length = sizeof(*hs_page4) - 4;
889                 memset(hs_header->frame_content, 0, hs_header->frame_length);
890                 hs_page4->ib_baseaddr_l = lower_32_bits(mhba->ib_list_phys);
891                 hs_page4->ib_baseaddr_h = upper_32_bits(mhba->ib_list_phys);
892
893                 hs_page4->ob_baseaddr_l = lower_32_bits(mhba->ob_list_phys);
894                 hs_page4->ob_baseaddr_h = upper_32_bits(mhba->ob_list_phys);
895                 hs_page4->ib_entry_size = mhba->ib_max_size_setting;
896                 hs_page4->ob_entry_size = mhba->ob_max_size_setting;
897                 if (mhba->hba_capability
898                         & HS_CAPABILITY_NEW_PAGE_IO_DEPTH_DEF) {
899                         hs_page4->ob_depth = find_first_bit((unsigned long *)
900                                                             &mhba->list_num_io,
901                                                             BITS_PER_LONG);
902                         hs_page4->ib_depth = find_first_bit((unsigned long *)
903                                                             &mhba->list_num_io,
904                                                             BITS_PER_LONG);
905                 } else {
906                         hs_page4->ob_depth = (u8) mhba->list_num_io;
907                         hs_page4->ib_depth = (u8) mhba->list_num_io;
908                 }
909                 hs_header->checksum = mvumi_calculate_checksum(hs_header,
910                                                 hs_header->frame_length);
911                 break;
912
913         default:
914                 dev_err(&mhba->pdev->dev, "cannot build page, code[0x%x]\n",
915                         hs_header->page_code);
916                 break;
917         }
918 }
919
920 /**
921  * mvumi_init_data -    Initialize requested date for FW
922  * @mhba:                       Adapter soft state
923  */
924 static int mvumi_init_data(struct mvumi_hba *mhba)
925 {
926         struct mvumi_ob_data *ob_pool;
927         struct mvumi_res *res_mgnt;
928         unsigned int tmp_size, offset, i;
929         void *virmem, *v;
930         dma_addr_t p;
931
932         if (mhba->fw_flag & MVUMI_FW_ALLOC)
933                 return 0;
934
935         tmp_size = mhba->ib_max_size * mhba->max_io;
936         if (mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC)
937                 tmp_size += sizeof(struct mvumi_dyn_list_entry) * mhba->max_io;
938
939         tmp_size += 128 + mhba->ob_max_size * mhba->max_io;
940         tmp_size += 8 + sizeof(u32)*2 + 16;
941
942         res_mgnt = mvumi_alloc_mem_resource(mhba,
943                                         RESOURCE_UNCACHED_MEMORY, tmp_size);
944         if (!res_mgnt) {
945                 dev_err(&mhba->pdev->dev,
946                         "failed to allocate memory for inbound list\n");
947                 goto fail_alloc_dma_buf;
948         }
949
950         p = res_mgnt->bus_addr;
951         v = res_mgnt->virt_addr;
952         /* ib_list */
953         offset = round_up(p, 128) - p;
954         p += offset;
955         v += offset;
956         mhba->ib_list = v;
957         mhba->ib_list_phys = p;
958         if (mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC) {
959                 v += sizeof(struct mvumi_dyn_list_entry) * mhba->max_io;
960                 p += sizeof(struct mvumi_dyn_list_entry) * mhba->max_io;
961                 mhba->ib_frame = v;
962                 mhba->ib_frame_phys = p;
963         }
964         v += mhba->ib_max_size * mhba->max_io;
965         p += mhba->ib_max_size * mhba->max_io;
966
967         /* ib shadow */
968         offset = round_up(p, 8) - p;
969         p += offset;
970         v += offset;
971         mhba->ib_shadow = v;
972         mhba->ib_shadow_phys = p;
973         p += sizeof(u32)*2;
974         v += sizeof(u32)*2;
975         /* ob shadow */
976         if (mhba->pdev->device == PCI_DEVICE_ID_MARVELL_MV9580) {
977                 offset = round_up(p, 8) - p;
978                 p += offset;
979                 v += offset;
980                 mhba->ob_shadow = v;
981                 mhba->ob_shadow_phys = p;
982                 p += 8;
983                 v += 8;
984         } else {
985                 offset = round_up(p, 4) - p;
986                 p += offset;
987                 v += offset;
988                 mhba->ob_shadow = v;
989                 mhba->ob_shadow_phys = p;
990                 p += 4;
991                 v += 4;
992         }
993
994         /* ob list */
995         offset = round_up(p, 128) - p;
996         p += offset;
997         v += offset;
998
999         mhba->ob_list = v;
1000         mhba->ob_list_phys = p;
1001
1002         /* ob data pool */
1003         tmp_size = mhba->max_io * (mhba->ob_max_size + sizeof(*ob_pool));
1004         tmp_size = round_up(tmp_size, 8);
1005
1006         res_mgnt = mvumi_alloc_mem_resource(mhba,
1007                                 RESOURCE_CACHED_MEMORY, tmp_size);
1008         if (!res_mgnt) {
1009                 dev_err(&mhba->pdev->dev,
1010                         "failed to allocate memory for outbound data buffer\n");
1011                 goto fail_alloc_dma_buf;
1012         }
1013         virmem = res_mgnt->virt_addr;
1014
1015         for (i = mhba->max_io; i != 0; i--) {
1016                 ob_pool = (struct mvumi_ob_data *) virmem;
1017                 list_add_tail(&ob_pool->list, &mhba->ob_data_list);
1018                 virmem += mhba->ob_max_size + sizeof(*ob_pool);
1019         }
1020
1021         tmp_size = sizeof(unsigned short) * mhba->max_io +
1022                                 sizeof(struct mvumi_cmd *) * mhba->max_io;
1023         tmp_size += round_up(mhba->max_target_id, sizeof(unsigned char) * 8) /
1024                                                 (sizeof(unsigned char) * 8);
1025
1026         res_mgnt = mvumi_alloc_mem_resource(mhba,
1027                                 RESOURCE_CACHED_MEMORY, tmp_size);
1028         if (!res_mgnt) {
1029                 dev_err(&mhba->pdev->dev,
1030                         "failed to allocate memory for tag and target map\n");
1031                 goto fail_alloc_dma_buf;
1032         }
1033
1034         virmem = res_mgnt->virt_addr;
1035         mhba->tag_pool.stack = virmem;
1036         mhba->tag_pool.size = mhba->max_io;
1037         tag_init(&mhba->tag_pool, mhba->max_io);
1038         virmem += sizeof(unsigned short) * mhba->max_io;
1039
1040         mhba->tag_cmd = virmem;
1041         virmem += sizeof(struct mvumi_cmd *) * mhba->max_io;
1042
1043         mhba->target_map = virmem;
1044
1045         mhba->fw_flag |= MVUMI_FW_ALLOC;
1046         return 0;
1047
1048 fail_alloc_dma_buf:
1049         mvumi_release_mem_resource(mhba);
1050         return -1;
1051 }
1052
1053 static int mvumi_hs_process_page(struct mvumi_hba *mhba,
1054                                 struct mvumi_hs_header *hs_header)
1055 {
1056         struct mvumi_hs_page1 *hs_page1;
1057         unsigned char page_checksum;
1058
1059         page_checksum = mvumi_calculate_checksum(hs_header,
1060                                                 hs_header->frame_length);
1061         if (page_checksum != hs_header->checksum) {
1062                 dev_err(&mhba->pdev->dev, "checksum error\n");
1063                 return -1;
1064         }
1065
1066         switch (hs_header->page_code) {
1067         case HS_PAGE_FIRM_CAP:
1068                 hs_page1 = (struct mvumi_hs_page1 *) hs_header;
1069
1070                 mhba->max_io = hs_page1->max_io_support;
1071                 mhba->list_num_io = hs_page1->cl_inout_list_depth;
1072                 mhba->max_transfer_size = hs_page1->max_transfer_size;
1073                 mhba->max_target_id = hs_page1->max_devices_support;
1074                 mhba->hba_capability = hs_page1->capability;
1075                 mhba->ib_max_size_setting = hs_page1->cl_in_max_entry_size;
1076                 mhba->ib_max_size = (1 << hs_page1->cl_in_max_entry_size) << 2;
1077
1078                 mhba->ob_max_size_setting = hs_page1->cl_out_max_entry_size;
1079                 mhba->ob_max_size = (1 << hs_page1->cl_out_max_entry_size) << 2;
1080
1081                 dev_dbg(&mhba->pdev->dev, "FW version:%d\n",
1082                                                 hs_page1->fw_ver.ver_build);
1083
1084                 if (mhba->hba_capability & HS_CAPABILITY_SUPPORT_COMPACT_SG)
1085                         mhba->eot_flag = 22;
1086                 else
1087                         mhba->eot_flag = 27;
1088                 if (mhba->hba_capability & HS_CAPABILITY_NEW_PAGE_IO_DEPTH_DEF)
1089                         mhba->list_num_io = 1 << hs_page1->cl_inout_list_depth;
1090                 break;
1091         default:
1092                 dev_err(&mhba->pdev->dev, "handshake: page code error\n");
1093                 return -1;
1094         }
1095         return 0;
1096 }
1097
1098 /**
1099  * mvumi_handshake -    Move the FW to READY state
1100  * @mhba:                               Adapter soft state
1101  *
1102  * During the initialization, FW passes can potentially be in any one of
1103  * several possible states. If the FW in operational, waiting-for-handshake
1104  * states, driver must take steps to bring it to ready state. Otherwise, it
1105  * has to wait for the ready state.
1106  */
1107 static int mvumi_handshake(struct mvumi_hba *mhba)
1108 {
1109         unsigned int hs_state, tmp, hs_fun;
1110         struct mvumi_hs_header *hs_header;
1111         struct mvumi_hw_regs *regs = mhba->regs;
1112
1113         if (mhba->fw_state == FW_STATE_STARTING)
1114                 hs_state = HS_S_START;
1115         else {
1116                 tmp = ioread32(regs->arm_to_pciea_msg0);
1117                 hs_state = HS_GET_STATE(tmp);
1118                 dev_dbg(&mhba->pdev->dev, "handshake state[0x%x].\n", hs_state);
1119                 if (HS_GET_STATUS(tmp) != HS_STATUS_OK) {
1120                         mhba->fw_state = FW_STATE_STARTING;
1121                         return -1;
1122                 }
1123         }
1124
1125         hs_fun = 0;
1126         switch (hs_state) {
1127         case HS_S_START:
1128                 mhba->fw_state = FW_STATE_HANDSHAKING;
1129                 HS_SET_STATUS(hs_fun, HS_STATUS_OK);
1130                 HS_SET_STATE(hs_fun, HS_S_RESET);
1131                 iowrite32(HANDSHAKE_SIGNATURE, regs->pciea_to_arm_msg1);
1132                 iowrite32(hs_fun, regs->pciea_to_arm_msg0);
1133                 iowrite32(DRBL_HANDSHAKE, regs->pciea_to_arm_drbl_reg);
1134                 break;
1135
1136         case HS_S_RESET:
1137                 iowrite32(lower_32_bits(mhba->handshake_page_phys),
1138                                         regs->pciea_to_arm_msg1);
1139                 iowrite32(upper_32_bits(mhba->handshake_page_phys),
1140                                         regs->arm_to_pciea_msg1);
1141                 HS_SET_STATUS(hs_fun, HS_STATUS_OK);
1142                 HS_SET_STATE(hs_fun, HS_S_PAGE_ADDR);
1143                 iowrite32(hs_fun, regs->pciea_to_arm_msg0);
1144                 iowrite32(DRBL_HANDSHAKE, regs->pciea_to_arm_drbl_reg);
1145                 break;
1146
1147         case HS_S_PAGE_ADDR:
1148         case HS_S_QUERY_PAGE:
1149         case HS_S_SEND_PAGE:
1150                 hs_header = (struct mvumi_hs_header *) mhba->handshake_page;
1151                 if (hs_header->page_code == HS_PAGE_FIRM_CAP) {
1152                         mhba->hba_total_pages =
1153                         ((struct mvumi_hs_page1 *) hs_header)->total_pages;
1154
1155                         if (mhba->hba_total_pages == 0)
1156                                 mhba->hba_total_pages = HS_PAGE_TOTAL-1;
1157                 }
1158
1159                 if (hs_state == HS_S_QUERY_PAGE) {
1160                         if (mvumi_hs_process_page(mhba, hs_header)) {
1161                                 HS_SET_STATE(hs_fun, HS_S_ABORT);
1162                                 return -1;
1163                         }
1164                         if (mvumi_init_data(mhba)) {
1165                                 HS_SET_STATE(hs_fun, HS_S_ABORT);
1166                                 return -1;
1167                         }
1168                 } else if (hs_state == HS_S_PAGE_ADDR) {
1169                         hs_header->page_code = 0;
1170                         mhba->hba_total_pages = HS_PAGE_TOTAL-1;
1171                 }
1172
1173                 if ((hs_header->page_code + 1) <= mhba->hba_total_pages) {
1174                         hs_header->page_code++;
1175                         if (hs_header->page_code != HS_PAGE_FIRM_CAP) {
1176                                 mvumi_hs_build_page(mhba, hs_header);
1177                                 HS_SET_STATE(hs_fun, HS_S_SEND_PAGE);
1178                         } else
1179                                 HS_SET_STATE(hs_fun, HS_S_QUERY_PAGE);
1180                 } else
1181                         HS_SET_STATE(hs_fun, HS_S_END);
1182
1183                 HS_SET_STATUS(hs_fun, HS_STATUS_OK);
1184                 iowrite32(hs_fun, regs->pciea_to_arm_msg0);
1185                 iowrite32(DRBL_HANDSHAKE, regs->pciea_to_arm_drbl_reg);
1186                 break;
1187
1188         case HS_S_END:
1189                 /* Set communication list ISR */
1190                 tmp = ioread32(regs->enpointa_mask_reg);
1191                 tmp |= regs->int_comaout | regs->int_comaerr;
1192                 iowrite32(tmp, regs->enpointa_mask_reg);
1193                 iowrite32(mhba->list_num_io, mhba->ib_shadow);
1194                 /* Set InBound List Available count shadow */
1195                 iowrite32(lower_32_bits(mhba->ib_shadow_phys),
1196                                         regs->inb_aval_count_basel);
1197                 iowrite32(upper_32_bits(mhba->ib_shadow_phys),
1198                                         regs->inb_aval_count_baseh);
1199
1200                 if (mhba->pdev->device == PCI_DEVICE_ID_MARVELL_MV9143) {
1201                         /* Set OutBound List Available count shadow */
1202                         iowrite32((mhba->list_num_io-1) |
1203                                                         regs->cl_pointer_toggle,
1204                                                         mhba->ob_shadow);
1205                         iowrite32(lower_32_bits(mhba->ob_shadow_phys),
1206                                                         regs->outb_copy_basel);
1207                         iowrite32(upper_32_bits(mhba->ob_shadow_phys),
1208                                                         regs->outb_copy_baseh);
1209                 }
1210
1211                 mhba->ib_cur_slot = (mhba->list_num_io - 1) |
1212                                                         regs->cl_pointer_toggle;
1213                 mhba->ob_cur_slot = (mhba->list_num_io - 1) |
1214                                                         regs->cl_pointer_toggle;
1215                 mhba->fw_state = FW_STATE_STARTED;
1216
1217                 break;
1218         default:
1219                 dev_err(&mhba->pdev->dev, "unknown handshake state [0x%x].\n",
1220                                                                 hs_state);
1221                 return -1;
1222         }
1223         return 0;
1224 }
1225
1226 static unsigned char mvumi_handshake_event(struct mvumi_hba *mhba)
1227 {
1228         unsigned int isr_status;
1229         unsigned long before;
1230
1231         before = jiffies;
1232         mvumi_handshake(mhba);
1233         do {
1234                 isr_status = mhba->instancet->read_fw_status_reg(mhba);
1235
1236                 if (mhba->fw_state == FW_STATE_STARTED)
1237                         return 0;
1238                 if (time_after(jiffies, before + FW_MAX_DELAY * HZ)) {
1239                         dev_err(&mhba->pdev->dev,
1240                                 "no handshake response at state 0x%x.\n",
1241                                   mhba->fw_state);
1242                         dev_err(&mhba->pdev->dev,
1243                                 "isr : global=0x%x,status=0x%x.\n",
1244                                         mhba->global_isr, isr_status);
1245                         return -1;
1246                 }
1247                 rmb();
1248                 usleep_range(1000, 2000);
1249         } while (!(isr_status & DRBL_HANDSHAKE_ISR));
1250
1251         return 0;
1252 }
1253
1254 static unsigned char mvumi_check_handshake(struct mvumi_hba *mhba)
1255 {
1256         unsigned int tmp;
1257         unsigned long before;
1258
1259         before = jiffies;
1260         tmp = ioread32(mhba->regs->arm_to_pciea_msg1);
1261         while ((tmp != HANDSHAKE_READYSTATE) && (tmp != HANDSHAKE_DONESTATE)) {
1262                 if (tmp != HANDSHAKE_READYSTATE)
1263                         iowrite32(DRBL_MU_RESET,
1264                                         mhba->regs->pciea_to_arm_drbl_reg);
1265                 if (time_after(jiffies, before + FW_MAX_DELAY * HZ)) {
1266                         dev_err(&mhba->pdev->dev,
1267                                 "invalid signature [0x%x].\n", tmp);
1268                         return -1;
1269                 }
1270                 usleep_range(1000, 2000);
1271                 rmb();
1272                 tmp = ioread32(mhba->regs->arm_to_pciea_msg1);
1273         }
1274
1275         mhba->fw_state = FW_STATE_STARTING;
1276         dev_dbg(&mhba->pdev->dev, "start firmware handshake...\n");
1277         do {
1278                 if (mvumi_handshake_event(mhba)) {
1279                         dev_err(&mhba->pdev->dev,
1280                                         "handshake failed at state 0x%x.\n",
1281                                                 mhba->fw_state);
1282                         return -1;
1283                 }
1284         } while (mhba->fw_state != FW_STATE_STARTED);
1285
1286         dev_dbg(&mhba->pdev->dev, "firmware handshake done\n");
1287
1288         return 0;
1289 }
1290
1291 static unsigned char mvumi_start(struct mvumi_hba *mhba)
1292 {
1293         unsigned int tmp;
1294         struct mvumi_hw_regs *regs = mhba->regs;
1295
1296         /* clear Door bell */
1297         tmp = ioread32(regs->arm_to_pciea_drbl_reg);
1298         iowrite32(tmp, regs->arm_to_pciea_drbl_reg);
1299
1300         iowrite32(regs->int_drbl_int_mask, regs->arm_to_pciea_mask_reg);
1301         tmp = ioread32(regs->enpointa_mask_reg) | regs->int_dl_cpu2pciea;
1302         iowrite32(tmp, regs->enpointa_mask_reg);
1303         msleep(100);
1304         if (mvumi_check_handshake(mhba))
1305                 return -1;
1306
1307         return 0;
1308 }
1309
1310 /**
1311  * mvumi_complete_cmd - Completes a command
1312  * @mhba:                       Adapter soft state
1313  * @cmd:                        Command to be completed
1314  */
1315 static void mvumi_complete_cmd(struct mvumi_hba *mhba, struct mvumi_cmd *cmd,
1316                                         struct mvumi_rsp_frame *ob_frame)
1317 {
1318         struct scsi_cmnd *scmd = cmd->scmd;
1319
1320         cmd->scmd->SCp.ptr = NULL;
1321         scmd->result = ob_frame->req_status;
1322
1323         switch (ob_frame->req_status) {
1324         case SAM_STAT_GOOD:
1325                 scmd->result |= DID_OK << 16;
1326                 break;
1327         case SAM_STAT_BUSY:
1328                 scmd->result |= DID_BUS_BUSY << 16;
1329                 break;
1330         case SAM_STAT_CHECK_CONDITION:
1331                 scmd->result |= (DID_OK << 16);
1332                 if (ob_frame->rsp_flag & CL_RSP_FLAG_SENSEDATA) {
1333                         memcpy(cmd->scmd->sense_buffer, ob_frame->payload,
1334                                 sizeof(struct mvumi_sense_data));
1335                         scmd->result |=  (DRIVER_SENSE << 24);
1336                 }
1337                 break;
1338         default:
1339                 scmd->result |= (DRIVER_INVALID << 24) | (DID_ABORT << 16);
1340                 break;
1341         }
1342
1343         if (scsi_bufflen(scmd))
1344                 dma_unmap_sg(&mhba->pdev->dev, scsi_sglist(scmd),
1345                              scsi_sg_count(scmd),
1346                              scmd->sc_data_direction);
1347         cmd->scmd->scsi_done(scmd);
1348         mvumi_return_cmd(mhba, cmd);
1349 }
1350
1351 static void mvumi_complete_internal_cmd(struct mvumi_hba *mhba,
1352                                                 struct mvumi_cmd *cmd,
1353                                         struct mvumi_rsp_frame *ob_frame)
1354 {
1355         if (atomic_read(&cmd->sync_cmd)) {
1356                 cmd->cmd_status = ob_frame->req_status;
1357
1358                 if ((ob_frame->req_status == SAM_STAT_CHECK_CONDITION) &&
1359                                 (ob_frame->rsp_flag & CL_RSP_FLAG_SENSEDATA) &&
1360                                 cmd->data_buf) {
1361                         memcpy(cmd->data_buf, ob_frame->payload,
1362                                         sizeof(struct mvumi_sense_data));
1363                 }
1364                 atomic_dec(&cmd->sync_cmd);
1365                 wake_up(&mhba->int_cmd_wait_q);
1366         }
1367 }
1368
1369 static void mvumi_show_event(struct mvumi_hba *mhba,
1370                         struct mvumi_driver_event *ptr)
1371 {
1372         unsigned int i;
1373
1374         dev_warn(&mhba->pdev->dev,
1375                 "Event[0x%x] id[0x%x] severity[0x%x] device id[0x%x]\n",
1376                 ptr->sequence_no, ptr->event_id, ptr->severity, ptr->device_id);
1377         if (ptr->param_count) {
1378                 printk(KERN_WARNING "Event param(len 0x%x): ",
1379                                                 ptr->param_count);
1380                 for (i = 0; i < ptr->param_count; i++)
1381                         printk(KERN_WARNING "0x%x ", ptr->params[i]);
1382
1383                 printk(KERN_WARNING "\n");
1384         }
1385
1386         if (ptr->sense_data_length) {
1387                 printk(KERN_WARNING "Event sense data(len 0x%x): ",
1388                                                 ptr->sense_data_length);
1389                 for (i = 0; i < ptr->sense_data_length; i++)
1390                         printk(KERN_WARNING "0x%x ", ptr->sense_data[i]);
1391                 printk(KERN_WARNING "\n");
1392         }
1393 }
1394
1395 static int mvumi_handle_hotplug(struct mvumi_hba *mhba, u16 devid, int status)
1396 {
1397         struct scsi_device *sdev;
1398         int ret = -1;
1399
1400         if (status == DEVICE_OFFLINE) {
1401                 sdev = scsi_device_lookup(mhba->shost, 0, devid, 0);
1402                 if (sdev) {
1403                         dev_dbg(&mhba->pdev->dev, "remove disk %d-%d-%d.\n", 0,
1404                                                                 sdev->id, 0);
1405                         scsi_remove_device(sdev);
1406                         scsi_device_put(sdev);
1407                         ret = 0;
1408                 } else
1409                         dev_err(&mhba->pdev->dev, " no disk[%d] to remove\n",
1410                                                                         devid);
1411         } else if (status == DEVICE_ONLINE) {
1412                 sdev = scsi_device_lookup(mhba->shost, 0, devid, 0);
1413                 if (!sdev) {
1414                         scsi_add_device(mhba->shost, 0, devid, 0);
1415                         dev_dbg(&mhba->pdev->dev, " add disk %d-%d-%d.\n", 0,
1416                                                                 devid, 0);
1417                         ret = 0;
1418                 } else {
1419                         dev_err(&mhba->pdev->dev, " don't add disk %d-%d-%d.\n",
1420                                                                 0, devid, 0);
1421                         scsi_device_put(sdev);
1422                 }
1423         }
1424         return ret;
1425 }
1426
1427 static u64 mvumi_inquiry(struct mvumi_hba *mhba,
1428         unsigned int id, struct mvumi_cmd *cmd)
1429 {
1430         struct mvumi_msg_frame *frame;
1431         u64 wwid = 0;
1432         int cmd_alloc = 0;
1433         int data_buf_len = 64;
1434
1435         if (!cmd) {
1436                 cmd = mvumi_create_internal_cmd(mhba, data_buf_len);
1437                 if (cmd)
1438                         cmd_alloc = 1;
1439                 else
1440                         return 0;
1441         } else {
1442                 memset(cmd->data_buf, 0, data_buf_len);
1443         }
1444         cmd->scmd = NULL;
1445         cmd->cmd_status = REQ_STATUS_PENDING;
1446         atomic_set(&cmd->sync_cmd, 0);
1447         frame = cmd->frame;
1448         frame->device_id = (u16) id;
1449         frame->cmd_flag = CMD_FLAG_DATA_IN;
1450         frame->req_function = CL_FUN_SCSI_CMD;
1451         frame->cdb_length = 6;
1452         frame->data_transfer_length = MVUMI_INQUIRY_LENGTH;
1453         memset(frame->cdb, 0, frame->cdb_length);
1454         frame->cdb[0] = INQUIRY;
1455         frame->cdb[4] = frame->data_transfer_length;
1456
1457         mvumi_issue_blocked_cmd(mhba, cmd);
1458
1459         if (cmd->cmd_status == SAM_STAT_GOOD) {
1460                 if (mhba->pdev->device == PCI_DEVICE_ID_MARVELL_MV9143)
1461                         wwid = id + 1;
1462                 else
1463                         memcpy((void *)&wwid,
1464                                (cmd->data_buf + MVUMI_INQUIRY_UUID_OFF),
1465                                MVUMI_INQUIRY_UUID_LEN);
1466                 dev_dbg(&mhba->pdev->dev,
1467                         "inquiry device(0:%d:0) wwid(%llx)\n", id, wwid);
1468         } else {
1469                 wwid = 0;
1470         }
1471         if (cmd_alloc)
1472                 mvumi_delete_internal_cmd(mhba, cmd);
1473
1474         return wwid;
1475 }
1476
1477 static void mvumi_detach_devices(struct mvumi_hba *mhba)
1478 {
1479         struct mvumi_device *mv_dev = NULL , *dev_next;
1480         struct scsi_device *sdev = NULL;
1481
1482         mutex_lock(&mhba->device_lock);
1483
1484         /* detach Hard Disk */
1485         list_for_each_entry_safe(mv_dev, dev_next,
1486                 &mhba->shost_dev_list, list) {
1487                 mvumi_handle_hotplug(mhba, mv_dev->id, DEVICE_OFFLINE);
1488                 list_del_init(&mv_dev->list);
1489                 dev_dbg(&mhba->pdev->dev, "release device(0:%d:0) wwid(%llx)\n",
1490                         mv_dev->id, mv_dev->wwid);
1491                 kfree(mv_dev);
1492         }
1493         list_for_each_entry_safe(mv_dev, dev_next, &mhba->mhba_dev_list, list) {
1494                 list_del_init(&mv_dev->list);
1495                 dev_dbg(&mhba->pdev->dev, "release device(0:%d:0) wwid(%llx)\n",
1496                         mv_dev->id, mv_dev->wwid);
1497                 kfree(mv_dev);
1498         }
1499
1500         /* detach virtual device */
1501         if (mhba->pdev->device == PCI_DEVICE_ID_MARVELL_MV9580)
1502                 sdev = scsi_device_lookup(mhba->shost, 0,
1503                                                 mhba->max_target_id - 1, 0);
1504
1505         if (sdev) {
1506                 scsi_remove_device(sdev);
1507                 scsi_device_put(sdev);
1508         }
1509
1510         mutex_unlock(&mhba->device_lock);
1511 }
1512
1513 static void mvumi_rescan_devices(struct mvumi_hba *mhba, int id)
1514 {
1515         struct scsi_device *sdev;
1516
1517         sdev = scsi_device_lookup(mhba->shost, 0, id, 0);
1518         if (sdev) {
1519                 scsi_rescan_device(&sdev->sdev_gendev);
1520                 scsi_device_put(sdev);
1521         }
1522 }
1523
1524 static int mvumi_match_devices(struct mvumi_hba *mhba, int id, u64 wwid)
1525 {
1526         struct mvumi_device *mv_dev = NULL;
1527
1528         list_for_each_entry(mv_dev, &mhba->shost_dev_list, list) {
1529                 if (mv_dev->wwid == wwid) {
1530                         if (mv_dev->id != id) {
1531                                 dev_err(&mhba->pdev->dev,
1532                                         "%s has same wwid[%llx] ,"
1533                                         " but different id[%d %d]\n",
1534                                         __func__, mv_dev->wwid, mv_dev->id, id);
1535                                 return -1;
1536                         } else {
1537                                 if (mhba->pdev->device ==
1538                                                 PCI_DEVICE_ID_MARVELL_MV9143)
1539                                         mvumi_rescan_devices(mhba, id);
1540                                 return 1;
1541                         }
1542                 }
1543         }
1544         return 0;
1545 }
1546
1547 static void mvumi_remove_devices(struct mvumi_hba *mhba, int id)
1548 {
1549         struct mvumi_device *mv_dev = NULL, *dev_next;
1550
1551         list_for_each_entry_safe(mv_dev, dev_next,
1552                                 &mhba->shost_dev_list, list) {
1553                 if (mv_dev->id == id) {
1554                         dev_dbg(&mhba->pdev->dev,
1555                                 "detach device(0:%d:0) wwid(%llx) from HOST\n",
1556                                 mv_dev->id, mv_dev->wwid);
1557                         mvumi_handle_hotplug(mhba, mv_dev->id, DEVICE_OFFLINE);
1558                         list_del_init(&mv_dev->list);
1559                         kfree(mv_dev);
1560                 }
1561         }
1562 }
1563
1564 static int mvumi_probe_devices(struct mvumi_hba *mhba)
1565 {
1566         int id, maxid;
1567         u64 wwid = 0;
1568         struct mvumi_device *mv_dev = NULL;
1569         struct mvumi_cmd *cmd = NULL;
1570         int found = 0;
1571
1572         cmd = mvumi_create_internal_cmd(mhba, 64);
1573         if (!cmd)
1574                 return -1;
1575
1576         if (mhba->pdev->device == PCI_DEVICE_ID_MARVELL_MV9143)
1577                 maxid = mhba->max_target_id;
1578         else
1579                 maxid = mhba->max_target_id - 1;
1580
1581         for (id = 0; id < maxid; id++) {
1582                 wwid = mvumi_inquiry(mhba, id, cmd);
1583                 if (!wwid) {
1584                         /* device no response, remove it */
1585                         mvumi_remove_devices(mhba, id);
1586                 } else {
1587                         /* device response, add it */
1588                         found = mvumi_match_devices(mhba, id, wwid);
1589                         if (!found) {
1590                                 mvumi_remove_devices(mhba, id);
1591                                 mv_dev = kzalloc(sizeof(struct mvumi_device),
1592                                                                 GFP_KERNEL);
1593                                 if (!mv_dev) {
1594                                         dev_err(&mhba->pdev->dev,
1595                                                 "%s alloc mv_dev failed\n",
1596                                                 __func__);
1597                                         continue;
1598                                 }
1599                                 mv_dev->id = id;
1600                                 mv_dev->wwid = wwid;
1601                                 mv_dev->sdev = NULL;
1602                                 INIT_LIST_HEAD(&mv_dev->list);
1603                                 list_add_tail(&mv_dev->list,
1604                                               &mhba->mhba_dev_list);
1605                                 dev_dbg(&mhba->pdev->dev,
1606                                         "probe a new device(0:%d:0)"
1607                                         " wwid(%llx)\n", id, mv_dev->wwid);
1608                         } else if (found == -1)
1609                                 return -1;
1610                         else
1611                                 continue;
1612                 }
1613         }
1614
1615         if (cmd)
1616                 mvumi_delete_internal_cmd(mhba, cmd);
1617
1618         return 0;
1619 }
1620
1621 static int mvumi_rescan_bus(void *data)
1622 {
1623         int ret = 0;
1624         struct mvumi_hba *mhba = (struct mvumi_hba *) data;
1625         struct mvumi_device *mv_dev = NULL , *dev_next;
1626
1627         while (!kthread_should_stop()) {
1628
1629                 set_current_state(TASK_INTERRUPTIBLE);
1630                 if (!atomic_read(&mhba->pnp_count))
1631                         schedule();
1632                 msleep(1000);
1633                 atomic_set(&mhba->pnp_count, 0);
1634                 __set_current_state(TASK_RUNNING);
1635
1636                 mutex_lock(&mhba->device_lock);
1637                 ret = mvumi_probe_devices(mhba);
1638                 if (!ret) {
1639                         list_for_each_entry_safe(mv_dev, dev_next,
1640                                                  &mhba->mhba_dev_list, list) {
1641                                 if (mvumi_handle_hotplug(mhba, mv_dev->id,
1642                                                          DEVICE_ONLINE)) {
1643                                         dev_err(&mhba->pdev->dev,
1644                                                 "%s add device(0:%d:0) failed"
1645                                                 "wwid(%llx) has exist\n",
1646                                                 __func__,
1647                                                 mv_dev->id, mv_dev->wwid);
1648                                         list_del_init(&mv_dev->list);
1649                                         kfree(mv_dev);
1650                                 } else {
1651                                         list_move_tail(&mv_dev->list,
1652                                                        &mhba->shost_dev_list);
1653                                 }
1654                         }
1655                 }
1656                 mutex_unlock(&mhba->device_lock);
1657         }
1658         return 0;
1659 }
1660
1661 static void mvumi_proc_msg(struct mvumi_hba *mhba,
1662                                         struct mvumi_hotplug_event *param)
1663 {
1664         u16 size = param->size;
1665         const unsigned long *ar_bitmap;
1666         const unsigned long *re_bitmap;
1667         int index;
1668
1669         if (mhba->fw_flag & MVUMI_FW_ATTACH) {
1670                 index = -1;
1671                 ar_bitmap = (const unsigned long *) param->bitmap;
1672                 re_bitmap = (const unsigned long *) &param->bitmap[size >> 3];
1673
1674                 mutex_lock(&mhba->sas_discovery_mutex);
1675                 do {
1676                         index = find_next_zero_bit(ar_bitmap, size, index + 1);
1677                         if (index >= size)
1678                                 break;
1679                         mvumi_handle_hotplug(mhba, index, DEVICE_ONLINE);
1680                 } while (1);
1681
1682                 index = -1;
1683                 do {
1684                         index = find_next_zero_bit(re_bitmap, size, index + 1);
1685                         if (index >= size)
1686                                 break;
1687                         mvumi_handle_hotplug(mhba, index, DEVICE_OFFLINE);
1688                 } while (1);
1689                 mutex_unlock(&mhba->sas_discovery_mutex);
1690         }
1691 }
1692
1693 static void mvumi_notification(struct mvumi_hba *mhba, u8 msg, void *buffer)
1694 {
1695         if (msg == APICDB1_EVENT_GETEVENT) {
1696                 int i, count;
1697                 struct mvumi_driver_event *param = NULL;
1698                 struct mvumi_event_req *er = buffer;
1699                 count = er->count;
1700                 if (count > MAX_EVENTS_RETURNED) {
1701                         dev_err(&mhba->pdev->dev, "event count[0x%x] is bigger"
1702                                         " than max event count[0x%x].\n",
1703                                         count, MAX_EVENTS_RETURNED);
1704                         return;
1705                 }
1706                 for (i = 0; i < count; i++) {
1707                         param = &er->events[i];
1708                         mvumi_show_event(mhba, param);
1709                 }
1710         } else if (msg == APICDB1_HOST_GETEVENT) {
1711                 mvumi_proc_msg(mhba, buffer);
1712         }
1713 }
1714
1715 static int mvumi_get_event(struct mvumi_hba *mhba, unsigned char msg)
1716 {
1717         struct mvumi_cmd *cmd;
1718         struct mvumi_msg_frame *frame;
1719
1720         cmd = mvumi_create_internal_cmd(mhba, 512);
1721         if (!cmd)
1722                 return -1;
1723         cmd->scmd = NULL;
1724         cmd->cmd_status = REQ_STATUS_PENDING;
1725         atomic_set(&cmd->sync_cmd, 0);
1726         frame = cmd->frame;
1727         frame->device_id = 0;
1728         frame->cmd_flag = CMD_FLAG_DATA_IN;
1729         frame->req_function = CL_FUN_SCSI_CMD;
1730         frame->cdb_length = MAX_COMMAND_SIZE;
1731         frame->data_transfer_length = sizeof(struct mvumi_event_req);
1732         memset(frame->cdb, 0, MAX_COMMAND_SIZE);
1733         frame->cdb[0] = APICDB0_EVENT;
1734         frame->cdb[1] = msg;
1735         mvumi_issue_blocked_cmd(mhba, cmd);
1736
1737         if (cmd->cmd_status != SAM_STAT_GOOD)
1738                 dev_err(&mhba->pdev->dev, "get event failed, status=0x%x.\n",
1739                                                         cmd->cmd_status);
1740         else
1741                 mvumi_notification(mhba, cmd->frame->cdb[1], cmd->data_buf);
1742
1743         mvumi_delete_internal_cmd(mhba, cmd);
1744         return 0;
1745 }
1746
1747 static void mvumi_scan_events(struct work_struct *work)
1748 {
1749         struct mvumi_events_wq *mu_ev =
1750                 container_of(work, struct mvumi_events_wq, work_q);
1751
1752         mvumi_get_event(mu_ev->mhba, mu_ev->event);
1753         kfree(mu_ev);
1754 }
1755
1756 static void mvumi_launch_events(struct mvumi_hba *mhba, u32 isr_status)
1757 {
1758         struct mvumi_events_wq *mu_ev;
1759
1760         while (isr_status & (DRBL_BUS_CHANGE | DRBL_EVENT_NOTIFY)) {
1761                 if (isr_status & DRBL_BUS_CHANGE) {
1762                         atomic_inc(&mhba->pnp_count);
1763                         wake_up_process(mhba->dm_thread);
1764                         isr_status &= ~(DRBL_BUS_CHANGE);
1765                         continue;
1766                 }
1767
1768                 mu_ev = kzalloc(sizeof(*mu_ev), GFP_ATOMIC);
1769                 if (mu_ev) {
1770                         INIT_WORK(&mu_ev->work_q, mvumi_scan_events);
1771                         mu_ev->mhba = mhba;
1772                         mu_ev->event = APICDB1_EVENT_GETEVENT;
1773                         isr_status &= ~(DRBL_EVENT_NOTIFY);
1774                         mu_ev->param = NULL;
1775                         schedule_work(&mu_ev->work_q);
1776                 }
1777         }
1778 }
1779
1780 static void mvumi_handle_clob(struct mvumi_hba *mhba)
1781 {
1782         struct mvumi_rsp_frame *ob_frame;
1783         struct mvumi_cmd *cmd;
1784         struct mvumi_ob_data *pool;
1785
1786         while (!list_empty(&mhba->free_ob_list)) {
1787                 pool = list_first_entry(&mhba->free_ob_list,
1788                                                 struct mvumi_ob_data, list);
1789                 list_del_init(&pool->list);
1790                 list_add_tail(&pool->list, &mhba->ob_data_list);
1791
1792                 ob_frame = (struct mvumi_rsp_frame *) &pool->data[0];
1793                 cmd = mhba->tag_cmd[ob_frame->tag];
1794
1795                 atomic_dec(&mhba->fw_outstanding);
1796                 mhba->tag_cmd[ob_frame->tag] = 0;
1797                 tag_release_one(mhba, &mhba->tag_pool, ob_frame->tag);
1798                 if (cmd->scmd)
1799                         mvumi_complete_cmd(mhba, cmd, ob_frame);
1800                 else
1801                         mvumi_complete_internal_cmd(mhba, cmd, ob_frame);
1802         }
1803         mhba->instancet->fire_cmd(mhba, NULL);
1804 }
1805
1806 static irqreturn_t mvumi_isr_handler(int irq, void *devp)
1807 {
1808         struct mvumi_hba *mhba = (struct mvumi_hba *) devp;
1809         unsigned long flags;
1810
1811         spin_lock_irqsave(mhba->shost->host_lock, flags);
1812         if (unlikely(mhba->instancet->clear_intr(mhba) || !mhba->global_isr)) {
1813                 spin_unlock_irqrestore(mhba->shost->host_lock, flags);
1814                 return IRQ_NONE;
1815         }
1816
1817         if (mhba->global_isr & mhba->regs->int_dl_cpu2pciea) {
1818                 if (mhba->isr_status & (DRBL_BUS_CHANGE | DRBL_EVENT_NOTIFY))
1819                         mvumi_launch_events(mhba, mhba->isr_status);
1820                 if (mhba->isr_status & DRBL_HANDSHAKE_ISR) {
1821                         dev_warn(&mhba->pdev->dev, "enter handshake again!\n");
1822                         mvumi_handshake(mhba);
1823                 }
1824
1825         }
1826
1827         if (mhba->global_isr & mhba->regs->int_comaout)
1828                 mvumi_receive_ob_list_entry(mhba);
1829
1830         mhba->global_isr = 0;
1831         mhba->isr_status = 0;
1832         if (mhba->fw_state == FW_STATE_STARTED)
1833                 mvumi_handle_clob(mhba);
1834         spin_unlock_irqrestore(mhba->shost->host_lock, flags);
1835         return IRQ_HANDLED;
1836 }
1837
1838 static enum mvumi_qc_result mvumi_send_command(struct mvumi_hba *mhba,
1839                                                 struct mvumi_cmd *cmd)
1840 {
1841         void *ib_entry;
1842         struct mvumi_msg_frame *ib_frame;
1843         unsigned int frame_len;
1844
1845         ib_frame = cmd->frame;
1846         if (unlikely(mhba->fw_state != FW_STATE_STARTED)) {
1847                 dev_dbg(&mhba->pdev->dev, "firmware not ready.\n");
1848                 return MV_QUEUE_COMMAND_RESULT_NO_RESOURCE;
1849         }
1850         if (tag_is_empty(&mhba->tag_pool)) {
1851                 dev_dbg(&mhba->pdev->dev, "no free tag.\n");
1852                 return MV_QUEUE_COMMAND_RESULT_NO_RESOURCE;
1853         }
1854         mvumi_get_ib_list_entry(mhba, &ib_entry);
1855
1856         cmd->frame->tag = tag_get_one(mhba, &mhba->tag_pool);
1857         cmd->frame->request_id = mhba->io_seq++;
1858         cmd->request_id = cmd->frame->request_id;
1859         mhba->tag_cmd[cmd->frame->tag] = cmd;
1860         frame_len = sizeof(*ib_frame) - 4 +
1861                                 ib_frame->sg_counts * sizeof(struct mvumi_sgl);
1862         if (mhba->hba_capability & HS_CAPABILITY_SUPPORT_DYN_SRC) {
1863                 struct mvumi_dyn_list_entry *dle;
1864                 dle = ib_entry;
1865                 dle->src_low_addr =
1866                         cpu_to_le32(lower_32_bits(cmd->frame_phys));
1867                 dle->src_high_addr =
1868                         cpu_to_le32(upper_32_bits(cmd->frame_phys));
1869                 dle->if_length = (frame_len >> 2) & 0xFFF;
1870         } else {
1871                 memcpy(ib_entry, ib_frame, frame_len);
1872         }
1873         return MV_QUEUE_COMMAND_RESULT_SENT;
1874 }
1875
1876 static void mvumi_fire_cmd(struct mvumi_hba *mhba, struct mvumi_cmd *cmd)
1877 {
1878         unsigned short num_of_cl_sent = 0;
1879         unsigned int count;
1880         enum mvumi_qc_result result;
1881
1882         if (cmd)
1883                 list_add_tail(&cmd->queue_pointer, &mhba->waiting_req_list);
1884         count = mhba->instancet->check_ib_list(mhba);
1885         if (list_empty(&mhba->waiting_req_list) || !count)
1886                 return;
1887
1888         do {
1889                 cmd = list_first_entry(&mhba->waiting_req_list,
1890                                        struct mvumi_cmd, queue_pointer);
1891                 list_del_init(&cmd->queue_pointer);
1892                 result = mvumi_send_command(mhba, cmd);
1893                 switch (result) {
1894                 case MV_QUEUE_COMMAND_RESULT_SENT:
1895                         num_of_cl_sent++;
1896                         break;
1897                 case MV_QUEUE_COMMAND_RESULT_NO_RESOURCE:
1898                         list_add(&cmd->queue_pointer, &mhba->waiting_req_list);
1899                         if (num_of_cl_sent > 0)
1900                                 mvumi_send_ib_list_entry(mhba);
1901
1902                         return;
1903                 }
1904         } while (!list_empty(&mhba->waiting_req_list) && count--);
1905
1906         if (num_of_cl_sent > 0)
1907                 mvumi_send_ib_list_entry(mhba);
1908 }
1909
1910 /**
1911  * mvumi_enable_intr -  Enables interrupts
1912  * @mhba:               Adapter soft state
1913  */
1914 static void mvumi_enable_intr(struct mvumi_hba *mhba)
1915 {
1916         unsigned int mask;
1917         struct mvumi_hw_regs *regs = mhba->regs;
1918
1919         iowrite32(regs->int_drbl_int_mask, regs->arm_to_pciea_mask_reg);
1920         mask = ioread32(regs->enpointa_mask_reg);
1921         mask |= regs->int_dl_cpu2pciea | regs->int_comaout | regs->int_comaerr;
1922         iowrite32(mask, regs->enpointa_mask_reg);
1923 }
1924
1925 /**
1926  * mvumi_disable_intr -Disables interrupt
1927  * @mhba:               Adapter soft state
1928  */
1929 static void mvumi_disable_intr(struct mvumi_hba *mhba)
1930 {
1931         unsigned int mask;
1932         struct mvumi_hw_regs *regs = mhba->regs;
1933
1934         iowrite32(0, regs->arm_to_pciea_mask_reg);
1935         mask = ioread32(regs->enpointa_mask_reg);
1936         mask &= ~(regs->int_dl_cpu2pciea | regs->int_comaout |
1937                                                         regs->int_comaerr);
1938         iowrite32(mask, regs->enpointa_mask_reg);
1939 }
1940
1941 static int mvumi_clear_intr(void *extend)
1942 {
1943         struct mvumi_hba *mhba = (struct mvumi_hba *) extend;
1944         unsigned int status, isr_status = 0, tmp = 0;
1945         struct mvumi_hw_regs *regs = mhba->regs;
1946
1947         status = ioread32(regs->main_int_cause_reg);
1948         if (!(status & regs->int_mu) || status == 0xFFFFFFFF)
1949                 return 1;
1950         if (unlikely(status & regs->int_comaerr)) {
1951                 tmp = ioread32(regs->outb_isr_cause);
1952                 if (mhba->pdev->device == PCI_DEVICE_ID_MARVELL_MV9580) {
1953                         if (tmp & regs->clic_out_err) {
1954                                 iowrite32(tmp & regs->clic_out_err,
1955                                                         regs->outb_isr_cause);
1956                         }
1957                 } else {
1958                         if (tmp & (regs->clic_in_err | regs->clic_out_err))
1959                                 iowrite32(tmp & (regs->clic_in_err |
1960                                                 regs->clic_out_err),
1961                                                 regs->outb_isr_cause);
1962                 }
1963                 status ^= mhba->regs->int_comaerr;
1964                 /* inbound or outbound parity error, command will timeout */
1965         }
1966         if (status & regs->int_comaout) {
1967                 tmp = ioread32(regs->outb_isr_cause);
1968                 if (tmp & regs->clic_irq)
1969                         iowrite32(tmp & regs->clic_irq, regs->outb_isr_cause);
1970         }
1971         if (status & regs->int_dl_cpu2pciea) {
1972                 isr_status = ioread32(regs->arm_to_pciea_drbl_reg);
1973                 if (isr_status)
1974                         iowrite32(isr_status, regs->arm_to_pciea_drbl_reg);
1975         }
1976
1977         mhba->global_isr = status;
1978         mhba->isr_status = isr_status;
1979
1980         return 0;
1981 }
1982
1983 /**
1984  * mvumi_read_fw_status_reg - returns the current FW status value
1985  * @mhba:               Adapter soft state
1986  */
1987 static unsigned int mvumi_read_fw_status_reg(struct mvumi_hba *mhba)
1988 {
1989         unsigned int status;
1990
1991         status = ioread32(mhba->regs->arm_to_pciea_drbl_reg);
1992         if (status)
1993                 iowrite32(status, mhba->regs->arm_to_pciea_drbl_reg);
1994         return status;
1995 }
1996
1997 static struct mvumi_instance_template mvumi_instance_9143 = {
1998         .fire_cmd = mvumi_fire_cmd,
1999         .enable_intr = mvumi_enable_intr,
2000         .disable_intr = mvumi_disable_intr,
2001         .clear_intr = mvumi_clear_intr,
2002         .read_fw_status_reg = mvumi_read_fw_status_reg,
2003         .check_ib_list = mvumi_check_ib_list_9143,
2004         .check_ob_list = mvumi_check_ob_list_9143,
2005         .reset_host = mvumi_reset_host_9143,
2006 };
2007
2008 static struct mvumi_instance_template mvumi_instance_9580 = {
2009         .fire_cmd = mvumi_fire_cmd,
2010         .enable_intr = mvumi_enable_intr,
2011         .disable_intr = mvumi_disable_intr,
2012         .clear_intr = mvumi_clear_intr,
2013         .read_fw_status_reg = mvumi_read_fw_status_reg,
2014         .check_ib_list = mvumi_check_ib_list_9580,
2015         .check_ob_list = mvumi_check_ob_list_9580,
2016         .reset_host = mvumi_reset_host_9580,
2017 };
2018
2019 static int mvumi_slave_configure(struct scsi_device *sdev)
2020 {
2021         struct mvumi_hba *mhba;
2022         unsigned char bitcount = sizeof(unsigned char) * 8;
2023
2024         mhba = (struct mvumi_hba *) sdev->host->hostdata;
2025         if (sdev->id >= mhba->max_target_id)
2026                 return -EINVAL;
2027
2028         mhba->target_map[sdev->id / bitcount] |= (1 << (sdev->id % bitcount));
2029         return 0;
2030 }
2031
2032 /**
2033  * mvumi_build_frame -  Prepares a direct cdb (DCDB) command
2034  * @mhba:               Adapter soft state
2035  * @scmd:               SCSI command
2036  * @cmd:                Command to be prepared in
2037  *
2038  * This function prepares CDB commands. These are typcially pass-through
2039  * commands to the devices.
2040  */
2041 static unsigned char mvumi_build_frame(struct mvumi_hba *mhba,
2042                                 struct scsi_cmnd *scmd, struct mvumi_cmd *cmd)
2043 {
2044         struct mvumi_msg_frame *pframe;
2045
2046         cmd->scmd = scmd;
2047         cmd->cmd_status = REQ_STATUS_PENDING;
2048         pframe = cmd->frame;
2049         pframe->device_id = ((unsigned short) scmd->device->id) |
2050                                 (((unsigned short) scmd->device->lun) << 8);
2051         pframe->cmd_flag = 0;
2052
2053         switch (scmd->sc_data_direction) {
2054         case DMA_NONE:
2055                 pframe->cmd_flag |= CMD_FLAG_NON_DATA;
2056                 break;
2057         case DMA_FROM_DEVICE:
2058                 pframe->cmd_flag |= CMD_FLAG_DATA_IN;
2059                 break;
2060         case DMA_TO_DEVICE:
2061                 pframe->cmd_flag |= CMD_FLAG_DATA_OUT;
2062                 break;
2063         case DMA_BIDIRECTIONAL:
2064         default:
2065                 dev_warn(&mhba->pdev->dev, "unexpected data direction[%d] "
2066                         "cmd[0x%x]\n", scmd->sc_data_direction, scmd->cmnd[0]);
2067                 goto error;
2068         }
2069
2070         pframe->cdb_length = scmd->cmd_len;
2071         memcpy(pframe->cdb, scmd->cmnd, pframe->cdb_length);
2072         pframe->req_function = CL_FUN_SCSI_CMD;
2073         if (scsi_bufflen(scmd)) {
2074                 if (mvumi_make_sgl(mhba, scmd, &pframe->payload[0],
2075                         &pframe->sg_counts))
2076                         goto error;
2077
2078                 pframe->data_transfer_length = scsi_bufflen(scmd);
2079         } else {
2080                 pframe->sg_counts = 0;
2081                 pframe->data_transfer_length = 0;
2082         }
2083         return 0;
2084
2085 error:
2086         scmd->result = (DID_OK << 16) | (DRIVER_SENSE << 24) |
2087                 SAM_STAT_CHECK_CONDITION;
2088         scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST, 0x24,
2089                                                                         0);
2090         return -1;
2091 }
2092
2093 /**
2094  * mvumi_queue_command -        Queue entry point
2095  * @scmd:                       SCSI command to be queued
2096  * @done:                       Callback entry point
2097  */
2098 static int mvumi_queue_command(struct Scsi_Host *shost,
2099                                         struct scsi_cmnd *scmd)
2100 {
2101         struct mvumi_cmd *cmd;
2102         struct mvumi_hba *mhba;
2103         unsigned long irq_flags;
2104
2105         spin_lock_irqsave(shost->host_lock, irq_flags);
2106         scsi_cmd_get_serial(shost, scmd);
2107
2108         mhba = (struct mvumi_hba *) shost->hostdata;
2109         scmd->result = 0;
2110         cmd = mvumi_get_cmd(mhba);
2111         if (unlikely(!cmd)) {
2112                 spin_unlock_irqrestore(shost->host_lock, irq_flags);
2113                 return SCSI_MLQUEUE_HOST_BUSY;
2114         }
2115
2116         if (unlikely(mvumi_build_frame(mhba, scmd, cmd)))
2117                 goto out_return_cmd;
2118
2119         cmd->scmd = scmd;
2120         scmd->SCp.ptr = (char *) cmd;
2121         mhba->instancet->fire_cmd(mhba, cmd);
2122         spin_unlock_irqrestore(shost->host_lock, irq_flags);
2123         return 0;
2124
2125 out_return_cmd:
2126         mvumi_return_cmd(mhba, cmd);
2127         scmd->scsi_done(scmd);
2128         spin_unlock_irqrestore(shost->host_lock, irq_flags);
2129         return 0;
2130 }
2131
2132 static enum blk_eh_timer_return mvumi_timed_out(struct scsi_cmnd *scmd)
2133 {
2134         struct mvumi_cmd *cmd = (struct mvumi_cmd *) scmd->SCp.ptr;
2135         struct Scsi_Host *host = scmd->device->host;
2136         struct mvumi_hba *mhba = shost_priv(host);
2137         unsigned long flags;
2138
2139         spin_lock_irqsave(mhba->shost->host_lock, flags);
2140
2141         if (mhba->tag_cmd[cmd->frame->tag]) {
2142                 mhba->tag_cmd[cmd->frame->tag] = 0;
2143                 tag_release_one(mhba, &mhba->tag_pool, cmd->frame->tag);
2144         }
2145         if (!list_empty(&cmd->queue_pointer))
2146                 list_del_init(&cmd->queue_pointer);
2147         else
2148                 atomic_dec(&mhba->fw_outstanding);
2149
2150         scmd->result = (DRIVER_INVALID << 24) | (DID_ABORT << 16);
2151         scmd->SCp.ptr = NULL;
2152         if (scsi_bufflen(scmd)) {
2153                 dma_unmap_sg(&mhba->pdev->dev, scsi_sglist(scmd),
2154                              scsi_sg_count(scmd),
2155                              scmd->sc_data_direction);
2156         }
2157         mvumi_return_cmd(mhba, cmd);
2158         spin_unlock_irqrestore(mhba->shost->host_lock, flags);
2159
2160         return BLK_EH_DONE;
2161 }
2162
2163 static int
2164 mvumi_bios_param(struct scsi_device *sdev, struct block_device *bdev,
2165                         sector_t capacity, int geom[])
2166 {
2167         int heads, sectors;
2168         sector_t cylinders;
2169         unsigned long tmp;
2170
2171         heads = 64;
2172         sectors = 32;
2173         tmp = heads * sectors;
2174         cylinders = capacity;
2175         sector_div(cylinders, tmp);
2176
2177         if (capacity >= 0x200000) {
2178                 heads = 255;
2179                 sectors = 63;
2180                 tmp = heads * sectors;
2181                 cylinders = capacity;
2182                 sector_div(cylinders, tmp);
2183         }
2184         geom[0] = heads;
2185         geom[1] = sectors;
2186         geom[2] = cylinders;
2187
2188         return 0;
2189 }
2190
2191 static struct scsi_host_template mvumi_template = {
2192
2193         .module = THIS_MODULE,
2194         .name = "Marvell Storage Controller",
2195         .slave_configure = mvumi_slave_configure,
2196         .queuecommand = mvumi_queue_command,
2197         .eh_timed_out = mvumi_timed_out,
2198         .eh_host_reset_handler = mvumi_host_reset,
2199         .bios_param = mvumi_bios_param,
2200         .this_id = -1,
2201 };
2202
2203 static int mvumi_cfg_hw_reg(struct mvumi_hba *mhba)
2204 {
2205         void *base = NULL;
2206         struct mvumi_hw_regs *regs;
2207
2208         switch (mhba->pdev->device) {
2209         case PCI_DEVICE_ID_MARVELL_MV9143:
2210                 mhba->mmio = mhba->base_addr[0];
2211                 base = mhba->mmio;
2212                 if (!mhba->regs) {
2213                         mhba->regs = kzalloc(sizeof(*regs), GFP_KERNEL);
2214                         if (mhba->regs == NULL)
2215                                 return -ENOMEM;
2216                 }
2217                 regs = mhba->regs;
2218
2219                 /* For Arm */
2220                 regs->ctrl_sts_reg          = base + 0x20104;
2221                 regs->rstoutn_mask_reg      = base + 0x20108;
2222                 regs->sys_soft_rst_reg      = base + 0x2010C;
2223                 regs->main_int_cause_reg    = base + 0x20200;
2224                 regs->enpointa_mask_reg     = base + 0x2020C;
2225                 regs->rstoutn_en_reg        = base + 0xF1400;
2226                 /* For Doorbell */
2227                 regs->pciea_to_arm_drbl_reg = base + 0x20400;
2228                 regs->arm_to_pciea_drbl_reg = base + 0x20408;
2229                 regs->arm_to_pciea_mask_reg = base + 0x2040C;
2230                 regs->pciea_to_arm_msg0     = base + 0x20430;
2231                 regs->pciea_to_arm_msg1     = base + 0x20434;
2232                 regs->arm_to_pciea_msg0     = base + 0x20438;
2233                 regs->arm_to_pciea_msg1     = base + 0x2043C;
2234
2235                 /* For Message Unit */
2236
2237                 regs->inb_aval_count_basel  = base + 0x508;
2238                 regs->inb_aval_count_baseh  = base + 0x50C;
2239                 regs->inb_write_pointer     = base + 0x518;
2240                 regs->inb_read_pointer      = base + 0x51C;
2241                 regs->outb_coal_cfg         = base + 0x568;
2242                 regs->outb_copy_basel       = base + 0x5B0;
2243                 regs->outb_copy_baseh       = base + 0x5B4;
2244                 regs->outb_copy_pointer     = base + 0x544;
2245                 regs->outb_read_pointer     = base + 0x548;
2246                 regs->outb_isr_cause        = base + 0x560;
2247                 regs->outb_coal_cfg         = base + 0x568;
2248                 /* Bit setting for HW */
2249                 regs->int_comaout           = 1 << 8;
2250                 regs->int_comaerr           = 1 << 6;
2251                 regs->int_dl_cpu2pciea      = 1 << 1;
2252                 regs->cl_pointer_toggle     = 1 << 12;
2253                 regs->clic_irq              = 1 << 1;
2254                 regs->clic_in_err           = 1 << 8;
2255                 regs->clic_out_err          = 1 << 12;
2256                 regs->cl_slot_num_mask      = 0xFFF;
2257                 regs->int_drbl_int_mask     = 0x3FFFFFFF;
2258                 regs->int_mu = regs->int_dl_cpu2pciea | regs->int_comaout |
2259                                                         regs->int_comaerr;
2260                 break;
2261         case PCI_DEVICE_ID_MARVELL_MV9580:
2262                 mhba->mmio = mhba->base_addr[2];
2263                 base = mhba->mmio;
2264                 if (!mhba->regs) {
2265                         mhba->regs = kzalloc(sizeof(*regs), GFP_KERNEL);
2266                         if (mhba->regs == NULL)
2267                                 return -ENOMEM;
2268                 }
2269                 regs = mhba->regs;
2270                 /* For Arm */
2271                 regs->ctrl_sts_reg          = base + 0x20104;
2272                 regs->rstoutn_mask_reg      = base + 0x1010C;
2273                 regs->sys_soft_rst_reg      = base + 0x10108;
2274                 regs->main_int_cause_reg    = base + 0x10200;
2275                 regs->enpointa_mask_reg     = base + 0x1020C;
2276                 regs->rstoutn_en_reg        = base + 0xF1400;
2277
2278                 /* For Doorbell */
2279                 regs->pciea_to_arm_drbl_reg = base + 0x10460;
2280                 regs->arm_to_pciea_drbl_reg = base + 0x10480;
2281                 regs->arm_to_pciea_mask_reg = base + 0x10484;
2282                 regs->pciea_to_arm_msg0     = base + 0x10400;
2283                 regs->pciea_to_arm_msg1     = base + 0x10404;
2284                 regs->arm_to_pciea_msg0     = base + 0x10420;
2285                 regs->arm_to_pciea_msg1     = base + 0x10424;
2286
2287                 /* For reset*/
2288                 regs->reset_request         = base + 0x10108;
2289                 regs->reset_enable          = base + 0x1010c;
2290
2291                 /* For Message Unit */
2292                 regs->inb_aval_count_basel  = base + 0x4008;
2293                 regs->inb_aval_count_baseh  = base + 0x400C;
2294                 regs->inb_write_pointer     = base + 0x4018;
2295                 regs->inb_read_pointer      = base + 0x401C;
2296                 regs->outb_copy_basel       = base + 0x4058;
2297                 regs->outb_copy_baseh       = base + 0x405C;
2298                 regs->outb_copy_pointer     = base + 0x406C;
2299                 regs->outb_read_pointer     = base + 0x4070;
2300                 regs->outb_coal_cfg         = base + 0x4080;
2301                 regs->outb_isr_cause        = base + 0x4088;
2302                 /* Bit setting for HW */
2303                 regs->int_comaout           = 1 << 4;
2304                 regs->int_dl_cpu2pciea      = 1 << 12;
2305                 regs->int_comaerr           = 1 << 29;
2306                 regs->cl_pointer_toggle     = 1 << 14;
2307                 regs->cl_slot_num_mask      = 0x3FFF;
2308                 regs->clic_irq              = 1 << 0;
2309                 regs->clic_out_err          = 1 << 1;
2310                 regs->int_drbl_int_mask     = 0x3FFFFFFF;
2311                 regs->int_mu = regs->int_dl_cpu2pciea | regs->int_comaout;
2312                 break;
2313         default:
2314                 return -1;
2315                 break;
2316         }
2317
2318         return 0;
2319 }
2320
2321 /**
2322  * mvumi_init_fw -      Initializes the FW
2323  * @mhba:               Adapter soft state
2324  *
2325  * This is the main function for initializing firmware.
2326  */
2327 static int mvumi_init_fw(struct mvumi_hba *mhba)
2328 {
2329         int ret = 0;
2330
2331         if (pci_request_regions(mhba->pdev, MV_DRIVER_NAME)) {
2332                 dev_err(&mhba->pdev->dev, "IO memory region busy!\n");
2333                 return -EBUSY;
2334         }
2335         ret = mvumi_map_pci_addr(mhba->pdev, mhba->base_addr);
2336         if (ret)
2337                 goto fail_ioremap;
2338
2339         switch (mhba->pdev->device) {
2340         case PCI_DEVICE_ID_MARVELL_MV9143:
2341                 mhba->instancet = &mvumi_instance_9143;
2342                 mhba->io_seq = 0;
2343                 mhba->max_sge = MVUMI_MAX_SG_ENTRY;
2344                 mhba->request_id_enabled = 1;
2345                 break;
2346         case PCI_DEVICE_ID_MARVELL_MV9580:
2347                 mhba->instancet = &mvumi_instance_9580;
2348                 mhba->io_seq = 0;
2349                 mhba->max_sge = MVUMI_MAX_SG_ENTRY;
2350                 break;
2351         default:
2352                 dev_err(&mhba->pdev->dev, "device 0x%x not supported!\n",
2353                                                         mhba->pdev->device);
2354                 mhba->instancet = NULL;
2355                 ret = -EINVAL;
2356                 goto fail_alloc_mem;
2357         }
2358         dev_dbg(&mhba->pdev->dev, "device id : %04X is found.\n",
2359                                                         mhba->pdev->device);
2360         ret = mvumi_cfg_hw_reg(mhba);
2361         if (ret) {
2362                 dev_err(&mhba->pdev->dev,
2363                         "failed to allocate memory for reg\n");
2364                 ret = -ENOMEM;
2365                 goto fail_alloc_mem;
2366         }
2367         mhba->handshake_page = dma_alloc_coherent(&mhba->pdev->dev,
2368                         HSP_MAX_SIZE, &mhba->handshake_page_phys, GFP_KERNEL);
2369         if (!mhba->handshake_page) {
2370                 dev_err(&mhba->pdev->dev,
2371                         "failed to allocate memory for handshake\n");
2372                 ret = -ENOMEM;
2373                 goto fail_alloc_page;
2374         }
2375
2376         if (mvumi_start(mhba)) {
2377                 ret = -EINVAL;
2378                 goto fail_ready_state;
2379         }
2380         ret = mvumi_alloc_cmds(mhba);
2381         if (ret)
2382                 goto fail_ready_state;
2383
2384         return 0;
2385
2386 fail_ready_state:
2387         mvumi_release_mem_resource(mhba);
2388         dma_free_coherent(&mhba->pdev->dev, HSP_MAX_SIZE,
2389                 mhba->handshake_page, mhba->handshake_page_phys);
2390 fail_alloc_page:
2391         kfree(mhba->regs);
2392 fail_alloc_mem:
2393         mvumi_unmap_pci_addr(mhba->pdev, mhba->base_addr);
2394 fail_ioremap:
2395         pci_release_regions(mhba->pdev);
2396
2397         return ret;
2398 }
2399
2400 /**
2401  * mvumi_io_attach -    Attaches this driver to SCSI mid-layer
2402  * @mhba:               Adapter soft state
2403  */
2404 static int mvumi_io_attach(struct mvumi_hba *mhba)
2405 {
2406         struct Scsi_Host *host = mhba->shost;
2407         struct scsi_device *sdev = NULL;
2408         int ret;
2409         unsigned int max_sg = (mhba->ib_max_size + 4 -
2410                 sizeof(struct mvumi_msg_frame)) / sizeof(struct mvumi_sgl);
2411
2412         host->irq = mhba->pdev->irq;
2413         host->unique_id = mhba->unique_id;
2414         host->can_queue = (mhba->max_io - 1) ? (mhba->max_io - 1) : 1;
2415         host->sg_tablesize = mhba->max_sge > max_sg ? max_sg : mhba->max_sge;
2416         host->max_sectors = mhba->max_transfer_size / 512;
2417         host->cmd_per_lun = (mhba->max_io - 1) ? (mhba->max_io - 1) : 1;
2418         host->max_id = mhba->max_target_id;
2419         host->max_cmd_len = MAX_COMMAND_SIZE;
2420
2421         ret = scsi_add_host(host, &mhba->pdev->dev);
2422         if (ret) {
2423                 dev_err(&mhba->pdev->dev, "scsi_add_host failed\n");
2424                 return ret;
2425         }
2426         mhba->fw_flag |= MVUMI_FW_ATTACH;
2427
2428         mutex_lock(&mhba->sas_discovery_mutex);
2429         if (mhba->pdev->device == PCI_DEVICE_ID_MARVELL_MV9580)
2430                 ret = scsi_add_device(host, 0, mhba->max_target_id - 1, 0);
2431         else
2432                 ret = 0;
2433         if (ret) {
2434                 dev_err(&mhba->pdev->dev, "add virtual device failed\n");
2435                 mutex_unlock(&mhba->sas_discovery_mutex);
2436                 goto fail_add_device;
2437         }
2438
2439         mhba->dm_thread = kthread_create(mvumi_rescan_bus,
2440                                                 mhba, "mvumi_scanthread");
2441         if (IS_ERR(mhba->dm_thread)) {
2442                 dev_err(&mhba->pdev->dev,
2443                         "failed to create device scan thread\n");
2444                 mutex_unlock(&mhba->sas_discovery_mutex);
2445                 goto fail_create_thread;
2446         }
2447         atomic_set(&mhba->pnp_count, 1);
2448         wake_up_process(mhba->dm_thread);
2449
2450         mutex_unlock(&mhba->sas_discovery_mutex);
2451         return 0;
2452
2453 fail_create_thread:
2454         if (mhba->pdev->device == PCI_DEVICE_ID_MARVELL_MV9580)
2455                 sdev = scsi_device_lookup(mhba->shost, 0,
2456                                                 mhba->max_target_id - 1, 0);
2457         if (sdev) {
2458                 scsi_remove_device(sdev);
2459                 scsi_device_put(sdev);
2460         }
2461 fail_add_device:
2462         scsi_remove_host(mhba->shost);
2463         return ret;
2464 }
2465
2466 /**
2467  * mvumi_probe_one -    PCI hotplug entry point
2468  * @pdev:               PCI device structure
2469  * @id:                 PCI ids of supported hotplugged adapter
2470  */
2471 static int mvumi_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2472 {
2473         struct Scsi_Host *host;
2474         struct mvumi_hba *mhba;
2475         int ret;
2476
2477         dev_dbg(&pdev->dev, " %#4.04x:%#4.04x:%#4.04x:%#4.04x: ",
2478                         pdev->vendor, pdev->device, pdev->subsystem_vendor,
2479                         pdev->subsystem_device);
2480
2481         ret = pci_enable_device(pdev);
2482         if (ret)
2483                 return ret;
2484
2485         ret = mvumi_pci_set_master(pdev);
2486         if (ret)
2487                 goto fail_set_dma_mask;
2488
2489         host = scsi_host_alloc(&mvumi_template, sizeof(*mhba));
2490         if (!host) {
2491                 dev_err(&pdev->dev, "scsi_host_alloc failed\n");
2492                 ret = -ENOMEM;
2493                 goto fail_alloc_instance;
2494         }
2495         mhba = shost_priv(host);
2496
2497         INIT_LIST_HEAD(&mhba->cmd_pool);
2498         INIT_LIST_HEAD(&mhba->ob_data_list);
2499         INIT_LIST_HEAD(&mhba->free_ob_list);
2500         INIT_LIST_HEAD(&mhba->res_list);
2501         INIT_LIST_HEAD(&mhba->waiting_req_list);
2502         mutex_init(&mhba->device_lock);
2503         INIT_LIST_HEAD(&mhba->mhba_dev_list);
2504         INIT_LIST_HEAD(&mhba->shost_dev_list);
2505         atomic_set(&mhba->fw_outstanding, 0);
2506         init_waitqueue_head(&mhba->int_cmd_wait_q);
2507         mutex_init(&mhba->sas_discovery_mutex);
2508
2509         mhba->pdev = pdev;
2510         mhba->shost = host;
2511         mhba->unique_id = pdev->bus->number << 8 | pdev->devfn;
2512
2513         ret = mvumi_init_fw(mhba);
2514         if (ret)
2515                 goto fail_init_fw;
2516
2517         ret = request_irq(mhba->pdev->irq, mvumi_isr_handler, IRQF_SHARED,
2518                                 "mvumi", mhba);
2519         if (ret) {
2520                 dev_err(&pdev->dev, "failed to register IRQ\n");
2521                 goto fail_init_irq;
2522         }
2523
2524         mhba->instancet->enable_intr(mhba);
2525         pci_set_drvdata(pdev, mhba);
2526
2527         ret = mvumi_io_attach(mhba);
2528         if (ret)
2529                 goto fail_io_attach;
2530
2531         mvumi_backup_bar_addr(mhba);
2532         dev_dbg(&pdev->dev, "probe mvumi driver successfully.\n");
2533
2534         return 0;
2535
2536 fail_io_attach:
2537         mhba->instancet->disable_intr(mhba);
2538         free_irq(mhba->pdev->irq, mhba);
2539 fail_init_irq:
2540         mvumi_release_fw(mhba);
2541 fail_init_fw:
2542         scsi_host_put(host);
2543
2544 fail_alloc_instance:
2545 fail_set_dma_mask:
2546         pci_disable_device(pdev);
2547
2548         return ret;
2549 }
2550
2551 static void mvumi_detach_one(struct pci_dev *pdev)
2552 {
2553         struct Scsi_Host *host;
2554         struct mvumi_hba *mhba;
2555
2556         mhba = pci_get_drvdata(pdev);
2557         if (mhba->dm_thread) {
2558                 kthread_stop(mhba->dm_thread);
2559                 mhba->dm_thread = NULL;
2560         }
2561
2562         mvumi_detach_devices(mhba);
2563         host = mhba->shost;
2564         scsi_remove_host(mhba->shost);
2565         mvumi_flush_cache(mhba);
2566
2567         mhba->instancet->disable_intr(mhba);
2568         free_irq(mhba->pdev->irq, mhba);
2569         mvumi_release_fw(mhba);
2570         scsi_host_put(host);
2571         pci_disable_device(pdev);
2572         dev_dbg(&pdev->dev, "driver is removed!\n");
2573 }
2574
2575 /**
2576  * mvumi_shutdown -     Shutdown entry point
2577  * @device:             Generic device structure
2578  */
2579 static void mvumi_shutdown(struct pci_dev *pdev)
2580 {
2581         struct mvumi_hba *mhba = pci_get_drvdata(pdev);
2582
2583         mvumi_flush_cache(mhba);
2584 }
2585
2586 static int __maybe_unused mvumi_suspend(struct pci_dev *pdev, pm_message_t state)
2587 {
2588         struct mvumi_hba *mhba = NULL;
2589
2590         mhba = pci_get_drvdata(pdev);
2591         mvumi_flush_cache(mhba);
2592
2593         pci_set_drvdata(pdev, mhba);
2594         mhba->instancet->disable_intr(mhba);
2595         free_irq(mhba->pdev->irq, mhba);
2596         mvumi_unmap_pci_addr(pdev, mhba->base_addr);
2597         pci_release_regions(pdev);
2598         pci_save_state(pdev);
2599         pci_disable_device(pdev);
2600         pci_set_power_state(pdev, pci_choose_state(pdev, state));
2601
2602         return 0;
2603 }
2604
2605 static int __maybe_unused mvumi_resume(struct pci_dev *pdev)
2606 {
2607         int ret;
2608         struct mvumi_hba *mhba = NULL;
2609
2610         mhba = pci_get_drvdata(pdev);
2611
2612         pci_set_power_state(pdev, PCI_D0);
2613         pci_enable_wake(pdev, PCI_D0, 0);
2614         pci_restore_state(pdev);
2615
2616         ret = pci_enable_device(pdev);
2617         if (ret) {
2618                 dev_err(&pdev->dev, "enable device failed\n");
2619                 return ret;
2620         }
2621
2622         ret = mvumi_pci_set_master(pdev);
2623         ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
2624         if (ret)
2625                 goto fail;
2626         ret = pci_request_regions(mhba->pdev, MV_DRIVER_NAME);
2627         if (ret)
2628                 goto fail;
2629         ret = mvumi_map_pci_addr(mhba->pdev, mhba->base_addr);
2630         if (ret)
2631                 goto release_regions;
2632
2633         if (mvumi_cfg_hw_reg(mhba)) {
2634                 ret = -EINVAL;
2635                 goto unmap_pci_addr;
2636         }
2637
2638         mhba->mmio = mhba->base_addr[0];
2639         mvumi_reset(mhba);
2640
2641         if (mvumi_start(mhba)) {
2642                 ret = -EINVAL;
2643                 goto unmap_pci_addr;
2644         }
2645
2646         ret = request_irq(mhba->pdev->irq, mvumi_isr_handler, IRQF_SHARED,
2647                                 "mvumi", mhba);
2648         if (ret) {
2649                 dev_err(&pdev->dev, "failed to register IRQ\n");
2650                 goto unmap_pci_addr;
2651         }
2652         mhba->instancet->enable_intr(mhba);
2653
2654         return 0;
2655
2656 unmap_pci_addr:
2657         mvumi_unmap_pci_addr(pdev, mhba->base_addr);
2658 release_regions:
2659         pci_release_regions(pdev);
2660 fail:
2661         pci_disable_device(pdev);
2662
2663         return ret;
2664 }
2665
2666 static struct pci_driver mvumi_pci_driver = {
2667
2668         .name = MV_DRIVER_NAME,
2669         .id_table = mvumi_pci_table,
2670         .probe = mvumi_probe_one,
2671         .remove = mvumi_detach_one,
2672         .shutdown = mvumi_shutdown,
2673 #ifdef CONFIG_PM
2674         .suspend = mvumi_suspend,
2675         .resume = mvumi_resume,
2676 #endif
2677 };
2678
2679 module_pci_driver(mvumi_pci_driver);