2 * Marvell 88SE64xx/88SE94xx pci init
4 * Copyright 2007 Red Hat, Inc.
5 * Copyright 2008 Marvell. <kewei@marvell.com>
7 * This file is licensed under GPLv2.
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; version 2 of the
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
28 static struct scsi_transport_template
*mvs_stt
;
29 static const struct mvs_chip_info mvs_chips
[] = {
30 [chip_6320
] = { 1, 2, 0x400, 17, 16, 9, &mvs_64xx_dispatch
, },
31 [chip_6440
] = { 1, 4, 0x400, 17, 16, 9, &mvs_64xx_dispatch
, },
32 [chip_6485
] = { 1, 8, 0x800, 33, 32, 10, &mvs_64xx_dispatch
, },
33 [chip_9180
] = { 2, 4, 0x800, 17, 64, 9, &mvs_94xx_dispatch
, },
34 [chip_9480
] = { 2, 4, 0x800, 17, 64, 9, &mvs_94xx_dispatch
, },
39 static struct scsi_host_template mvs_sht
= {
40 .module
= THIS_MODULE
,
42 .queuecommand
= sas_queuecommand
,
43 .target_alloc
= sas_target_alloc
,
44 .slave_configure
= mvs_slave_configure
,
45 .slave_destroy
= sas_slave_destroy
,
46 .scan_finished
= mvs_scan_finished
,
47 .scan_start
= mvs_scan_start
,
48 .change_queue_depth
= sas_change_queue_depth
,
49 .change_queue_type
= sas_change_queue_type
,
50 .bios_param
= sas_bios_param
,
54 .sg_tablesize
= SG_ALL
,
55 .max_sectors
= SCSI_DEFAULT_MAX_SECTORS
,
56 .use_clustering
= ENABLE_CLUSTERING
,
57 .eh_device_reset_handler
= sas_eh_device_reset_handler
,
58 .eh_bus_reset_handler
= sas_eh_bus_reset_handler
,
59 .slave_alloc
= mvs_slave_alloc
,
60 .target_destroy
= sas_target_destroy
,
64 static struct sas_domain_function_template mvs_transport_ops
= {
65 .lldd_dev_found
= mvs_dev_found
,
66 .lldd_dev_gone
= mvs_dev_gone
,
68 .lldd_execute_task
= mvs_queue_command
,
69 .lldd_control_phy
= mvs_phy_control
,
71 .lldd_abort_task
= mvs_abort_task
,
72 .lldd_abort_task_set
= mvs_abort_task_set
,
73 .lldd_clear_aca
= mvs_clear_aca
,
74 .lldd_clear_task_set
= mvs_clear_task_set
,
75 .lldd_I_T_nexus_reset
= mvs_I_T_nexus_reset
,
76 .lldd_lu_reset
= mvs_lu_reset
,
77 .lldd_query_task
= mvs_query_task
,
79 .lldd_port_formed
= mvs_port_formed
,
80 .lldd_port_deformed
= mvs_port_deformed
,
84 static void __devinit
mvs_phy_init(struct mvs_info
*mvi
, int phy_id
)
86 struct mvs_phy
*phy
= &mvi
->phy
[phy_id
];
87 struct asd_sas_phy
*sas_phy
= &phy
->sas_phy
;
90 init_timer(&phy
->timer
);
91 sas_phy
->enabled
= (phy_id
< mvi
->chip
->n_phy
) ? 1 : 0;
93 sas_phy
->iproto
= SAS_PROTOCOL_ALL
;
95 sas_phy
->type
= PHY_TYPE_PHYSICAL
;
96 sas_phy
->role
= PHY_ROLE_INITIATOR
;
97 sas_phy
->oob_mode
= OOB_NOT_CONNECTED
;
98 sas_phy
->linkrate
= SAS_LINK_RATE_UNKNOWN
;
100 sas_phy
->id
= phy_id
;
101 sas_phy
->sas_addr
= &mvi
->sas_addr
[0];
102 sas_phy
->frame_rcvd
= &phy
->frame_rcvd
[0];
103 sas_phy
->ha
= (struct sas_ha_struct
*)mvi
->shost
->hostdata
;
104 sas_phy
->lldd_phy
= phy
;
107 static void mvs_free(struct mvs_info
*mvi
)
116 if (mvi
->flags
& MVF_FLAG_SOC
)
117 slot_nr
= MVS_SOC_SLOTS
;
121 for (i
= 0; i
< mvi
->tags_num
; i
++) {
122 struct mvs_slot_info
*slot
= &mvi
->slot_info
[i
];
124 dma_free_coherent(mvi
->dev
, MVS_SLOT_BUF_SZ
,
125 slot
->buf
, slot
->buf_dma
);
129 dma_free_coherent(mvi
->dev
,
130 sizeof(*mvi
->tx
) * MVS_CHIP_SLOT_SZ
,
131 mvi
->tx
, mvi
->tx_dma
);
133 dma_free_coherent(mvi
->dev
, MVS_RX_FISL_SZ
,
134 mvi
->rx_fis
, mvi
->rx_fis_dma
);
136 dma_free_coherent(mvi
->dev
,
137 sizeof(*mvi
->rx
) * (MVS_RX_RING_SZ
+ 1),
138 mvi
->rx
, mvi
->rx_dma
);
140 dma_free_coherent(mvi
->dev
,
141 sizeof(*mvi
->slot
) * slot_nr
,
142 mvi
->slot
, mvi
->slot_dma
);
143 #ifndef DISABLE_HOTPLUG_DMA_FIX
144 if (mvi
->bulk_buffer
)
145 dma_free_coherent(mvi
->dev
, TRASH_BUCKET_SIZE
,
146 mvi
->bulk_buffer
, mvi
->bulk_buffer_dma
);
149 MVS_CHIP_DISP
->chip_iounmap(mvi
);
151 scsi_host_put(mvi
->shost
);
152 list_for_each_entry(mwq
, &mvi
->wq_list
, entry
)
153 cancel_delayed_work(&mwq
->work_q
);
157 #ifdef MVS_USE_TASKLET
158 struct tasklet_struct mv_tasklet
;
159 static void mvs_tasklet(unsigned long opaque
)
165 struct mvs_info
*mvi
;
166 struct sas_ha_struct
*sha
= (struct sas_ha_struct
*)opaque
;
168 core_nr
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->n_host
;
169 mvi
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->mvi
[0];
174 for (i
= 0; i
< core_nr
; i
++) {
175 mvi
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->mvi
[i
];
176 stat
= MVS_CHIP_DISP
->isr_status(mvi
, mvi
->irq
);
178 MVS_CHIP_DISP
->isr(mvi
, mvi
->irq
, stat
);
184 static irqreturn_t
mvs_interrupt(int irq
, void *opaque
)
188 struct mvs_info
*mvi
;
189 struct sas_ha_struct
*sha
= opaque
;
191 core_nr
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->n_host
;
192 mvi
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->mvi
[0];
197 stat
= MVS_CHIP_DISP
->isr_status(mvi
, irq
);
201 #ifdef MVS_USE_TASKLET
202 tasklet_schedule(&mv_tasklet
);
204 for (i
= 0; i
< core_nr
; i
++) {
205 mvi
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->mvi
[i
];
206 MVS_CHIP_DISP
->isr(mvi
, irq
, stat
);
212 static int __devinit
mvs_alloc(struct mvs_info
*mvi
, struct Scsi_Host
*shost
)
216 if (mvi
->flags
& MVF_FLAG_SOC
)
217 slot_nr
= MVS_SOC_SLOTS
;
221 spin_lock_init(&mvi
->lock
);
222 for (i
= 0; i
< mvi
->chip
->n_phy
; i
++) {
223 mvs_phy_init(mvi
, i
);
224 mvi
->port
[i
].wide_port_phymap
= 0;
225 mvi
->port
[i
].port_attached
= 0;
226 INIT_LIST_HEAD(&mvi
->port
[i
].list
);
228 for (i
= 0; i
< MVS_MAX_DEVICES
; i
++) {
229 mvi
->devices
[i
].taskfileset
= MVS_ID_NOT_MAPPED
;
230 mvi
->devices
[i
].dev_type
= NO_DEVICE
;
231 mvi
->devices
[i
].device_id
= i
;
232 mvi
->devices
[i
].dev_status
= MVS_DEV_NORMAL
;
236 * alloc and init our DMA areas
238 mvi
->tx
= dma_alloc_coherent(mvi
->dev
,
239 sizeof(*mvi
->tx
) * MVS_CHIP_SLOT_SZ
,
240 &mvi
->tx_dma
, GFP_KERNEL
);
243 memset(mvi
->tx
, 0, sizeof(*mvi
->tx
) * MVS_CHIP_SLOT_SZ
);
244 mvi
->rx_fis
= dma_alloc_coherent(mvi
->dev
, MVS_RX_FISL_SZ
,
245 &mvi
->rx_fis_dma
, GFP_KERNEL
);
248 memset(mvi
->rx_fis
, 0, MVS_RX_FISL_SZ
);
250 mvi
->rx
= dma_alloc_coherent(mvi
->dev
,
251 sizeof(*mvi
->rx
) * (MVS_RX_RING_SZ
+ 1),
252 &mvi
->rx_dma
, GFP_KERNEL
);
255 memset(mvi
->rx
, 0, sizeof(*mvi
->rx
) * (MVS_RX_RING_SZ
+ 1));
256 mvi
->rx
[0] = cpu_to_le32(0xfff);
257 mvi
->rx_cons
= 0xfff;
259 mvi
->slot
= dma_alloc_coherent(mvi
->dev
,
260 sizeof(*mvi
->slot
) * slot_nr
,
261 &mvi
->slot_dma
, GFP_KERNEL
);
264 memset(mvi
->slot
, 0, sizeof(*mvi
->slot
) * slot_nr
);
266 #ifndef DISABLE_HOTPLUG_DMA_FIX
267 mvi
->bulk_buffer
= dma_alloc_coherent(mvi
->dev
,
269 &mvi
->bulk_buffer_dma
, GFP_KERNEL
);
270 if (!mvi
->bulk_buffer
)
273 for (i
= 0; i
< slot_nr
; i
++) {
274 struct mvs_slot_info
*slot
= &mvi
->slot_info
[i
];
276 slot
->buf
= dma_alloc_coherent(mvi
->dev
, MVS_SLOT_BUF_SZ
,
277 &slot
->buf_dma
, GFP_KERNEL
);
279 printk(KERN_DEBUG
"failed to allocate slot->buf.\n");
282 memset(slot
->buf
, 0, MVS_SLOT_BUF_SZ
);
285 /* Initialize tags */
293 int mvs_ioremap(struct mvs_info
*mvi
, int bar
, int bar_ex
)
295 unsigned long res_start
, res_len
, res_flag
, res_flag_ex
= 0;
296 struct pci_dev
*pdev
= mvi
->pdev
;
299 * ioremap main and peripheral registers
301 res_start
= pci_resource_start(pdev
, bar_ex
);
302 res_len
= pci_resource_len(pdev
, bar_ex
);
303 if (!res_start
|| !res_len
)
306 res_flag_ex
= pci_resource_flags(pdev
, bar_ex
);
307 if (res_flag_ex
& IORESOURCE_MEM
) {
308 if (res_flag_ex
& IORESOURCE_CACHEABLE
)
309 mvi
->regs_ex
= ioremap(res_start
, res_len
);
311 mvi
->regs_ex
= ioremap_nocache(res_start
,
314 mvi
->regs_ex
= (void *)res_start
;
319 res_start
= pci_resource_start(pdev
, bar
);
320 res_len
= pci_resource_len(pdev
, bar
);
321 if (!res_start
|| !res_len
)
324 res_flag
= pci_resource_flags(pdev
, bar
);
325 if (res_flag
& IORESOURCE_CACHEABLE
)
326 mvi
->regs
= ioremap(res_start
, res_len
);
328 mvi
->regs
= ioremap_nocache(res_start
, res_len
);
331 if (mvi
->regs_ex
&& (res_flag_ex
& IORESOURCE_MEM
))
332 iounmap(mvi
->regs_ex
);
342 void mvs_iounmap(void __iomem
*regs
)
347 static struct mvs_info
*__devinit
mvs_pci_alloc(struct pci_dev
*pdev
,
348 const struct pci_device_id
*ent
,
349 struct Scsi_Host
*shost
, unsigned int id
)
351 struct mvs_info
*mvi
;
352 struct sas_ha_struct
*sha
= SHOST_TO_SAS_HA(shost
);
354 mvi
= kzalloc(sizeof(*mvi
) + MVS_SLOTS
* sizeof(struct mvs_slot_info
),
360 mvi
->dev
= &pdev
->dev
;
361 mvi
->chip_id
= ent
->driver_data
;
362 mvi
->chip
= &mvs_chips
[mvi
->chip_id
];
363 INIT_LIST_HEAD(&mvi
->wq_list
);
364 mvi
->irq
= pdev
->irq
;
366 ((struct mvs_prv_info
*)sha
->lldd_ha
)->mvi
[id
] = mvi
;
367 ((struct mvs_prv_info
*)sha
->lldd_ha
)->n_phy
= mvi
->chip
->n_phy
;
372 #ifdef MVS_USE_TASKLET
373 tasklet_init(&mv_tasklet
, mvs_tasklet
, (unsigned long)sha
);
376 if (MVS_CHIP_DISP
->chip_ioremap(mvi
))
378 if (!mvs_alloc(mvi
, shost
))
385 /* move to PCI layer or libata core? */
386 static int pci_go_64(struct pci_dev
*pdev
)
390 if (!pci_set_dma_mask(pdev
, DMA_BIT_MASK(64))) {
391 rc
= pci_set_consistent_dma_mask(pdev
, DMA_BIT_MASK(64));
393 rc
= pci_set_consistent_dma_mask(pdev
, DMA_BIT_MASK(32));
395 dev_printk(KERN_ERR
, &pdev
->dev
,
396 "64-bit DMA enable failed\n");
401 rc
= pci_set_dma_mask(pdev
, DMA_BIT_MASK(32));
403 dev_printk(KERN_ERR
, &pdev
->dev
,
404 "32-bit DMA enable failed\n");
407 rc
= pci_set_consistent_dma_mask(pdev
, DMA_BIT_MASK(32));
409 dev_printk(KERN_ERR
, &pdev
->dev
,
410 "32-bit consistent DMA enable failed\n");
418 static int __devinit
mvs_prep_sas_ha_init(struct Scsi_Host
*shost
,
419 const struct mvs_chip_info
*chip_info
)
421 int phy_nr
, port_nr
; unsigned short core_nr
;
422 struct asd_sas_phy
**arr_phy
;
423 struct asd_sas_port
**arr_port
;
424 struct sas_ha_struct
*sha
= SHOST_TO_SAS_HA(shost
);
426 core_nr
= chip_info
->n_host
;
427 phy_nr
= core_nr
* chip_info
->n_phy
;
430 memset(sha
, 0x00, sizeof(struct sas_ha_struct
));
431 arr_phy
= kcalloc(phy_nr
, sizeof(void *), GFP_KERNEL
);
432 arr_port
= kcalloc(port_nr
, sizeof(void *), GFP_KERNEL
);
433 if (!arr_phy
|| !arr_port
)
436 sha
->sas_phy
= arr_phy
;
437 sha
->sas_port
= arr_port
;
439 sha
->lldd_ha
= kzalloc(sizeof(struct mvs_prv_info
), GFP_KERNEL
);
443 ((struct mvs_prv_info
*)sha
->lldd_ha
)->n_host
= core_nr
;
445 shost
->transportt
= mvs_stt
;
448 shost
->max_channel
= 1;
449 shost
->max_cmd_len
= 16;
459 static void __devinit
mvs_post_sas_ha_init(struct Scsi_Host
*shost
,
460 const struct mvs_chip_info
*chip_info
)
462 int can_queue
, i
= 0, j
= 0;
463 struct mvs_info
*mvi
= NULL
;
464 struct sas_ha_struct
*sha
= SHOST_TO_SAS_HA(shost
);
465 unsigned short nr_core
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->n_host
;
467 for (j
= 0; j
< nr_core
; j
++) {
468 mvi
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->mvi
[j
];
469 for (i
= 0; i
< chip_info
->n_phy
; i
++) {
470 sha
->sas_phy
[j
* chip_info
->n_phy
+ i
] =
471 &mvi
->phy
[i
].sas_phy
;
472 sha
->sas_port
[j
* chip_info
->n_phy
+ i
] =
473 &mvi
->port
[i
].sas_port
;
477 sha
->sas_ha_name
= DRV_NAME
;
479 sha
->lldd_module
= THIS_MODULE
;
480 sha
->sas_addr
= &mvi
->sas_addr
[0];
482 sha
->num_phys
= nr_core
* chip_info
->n_phy
;
484 sha
->lldd_max_execute_num
= 1;
486 if (mvi
->flags
& MVF_FLAG_SOC
)
487 can_queue
= MVS_SOC_CAN_QUEUE
;
489 can_queue
= MVS_CAN_QUEUE
;
491 sha
->lldd_queue_size
= can_queue
;
492 shost
->can_queue
= can_queue
;
493 mvi
->shost
->cmd_per_lun
= MVS_SLOTS
/sha
->num_phys
;
494 sha
->core
.shost
= mvi
->shost
;
497 static void mvs_init_sas_add(struct mvs_info
*mvi
)
500 for (i
= 0; i
< mvi
->chip
->n_phy
; i
++) {
501 mvi
->phy
[i
].dev_sas_addr
= 0x5005043011ab0000ULL
;
502 mvi
->phy
[i
].dev_sas_addr
=
503 cpu_to_be64((u64
)(*(u64
*)&mvi
->phy
[i
].dev_sas_addr
));
506 memcpy(mvi
->sas_addr
, &mvi
->phy
[0].dev_sas_addr
, SAS_ADDR_SIZE
);
509 static int __devinit
mvs_pci_init(struct pci_dev
*pdev
,
510 const struct pci_device_id
*ent
)
512 unsigned int rc
, nhost
= 0;
513 struct mvs_info
*mvi
;
514 irq_handler_t irq_handler
= mvs_interrupt
;
515 struct Scsi_Host
*shost
= NULL
;
516 const struct mvs_chip_info
*chip
;
518 dev_printk(KERN_INFO
, &pdev
->dev
,
519 "mvsas: driver version %s\n", DRV_VERSION
);
520 rc
= pci_enable_device(pdev
);
524 pci_set_master(pdev
);
526 rc
= pci_request_regions(pdev
, DRV_NAME
);
528 goto err_out_disable
;
530 rc
= pci_go_64(pdev
);
532 goto err_out_regions
;
534 shost
= scsi_host_alloc(&mvs_sht
, sizeof(void *));
537 goto err_out_regions
;
540 chip
= &mvs_chips
[ent
->driver_data
];
541 SHOST_TO_SAS_HA(shost
) =
542 kcalloc(1, sizeof(struct sas_ha_struct
), GFP_KERNEL
);
543 if (!SHOST_TO_SAS_HA(shost
)) {
546 goto err_out_regions
;
549 rc
= mvs_prep_sas_ha_init(shost
, chip
);
553 goto err_out_regions
;
556 pci_set_drvdata(pdev
, SHOST_TO_SAS_HA(shost
));
559 mvi
= mvs_pci_alloc(pdev
, ent
, shost
, nhost
);
562 goto err_out_regions
;
565 mvs_init_sas_add(mvi
);
567 mvi
->instance
= nhost
;
568 rc
= MVS_CHIP_DISP
->chip_init(mvi
);
571 goto err_out_regions
;
574 } while (nhost
< chip
->n_host
);
576 mvs_post_sas_ha_init(shost
, chip
);
578 rc
= scsi_add_host(shost
, &pdev
->dev
);
582 rc
= sas_register_ha(SHOST_TO_SAS_HA(shost
));
585 rc
= request_irq(pdev
->irq
, irq_handler
, IRQF_SHARED
,
586 DRV_NAME
, SHOST_TO_SAS_HA(shost
));
590 MVS_CHIP_DISP
->interrupt_enable(mvi
);
592 scsi_scan_host(mvi
->shost
);
597 sas_unregister_ha(SHOST_TO_SAS_HA(shost
));
599 scsi_remove_host(mvi
->shost
);
601 pci_release_regions(pdev
);
603 pci_disable_device(pdev
);
608 static void __devexit
mvs_pci_remove(struct pci_dev
*pdev
)
610 unsigned short core_nr
, i
= 0;
611 struct sas_ha_struct
*sha
= pci_get_drvdata(pdev
);
612 struct mvs_info
*mvi
= NULL
;
614 core_nr
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->n_host
;
615 mvi
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->mvi
[0];
617 #ifdef MVS_USE_TASKLET
618 tasklet_kill(&mv_tasklet
);
621 pci_set_drvdata(pdev
, NULL
);
622 sas_unregister_ha(sha
);
623 sas_remove_host(mvi
->shost
);
624 scsi_remove_host(mvi
->shost
);
626 MVS_CHIP_DISP
->interrupt_disable(mvi
);
627 free_irq(mvi
->irq
, sha
);
628 for (i
= 0; i
< core_nr
; i
++) {
629 mvi
= ((struct mvs_prv_info
*)sha
->lldd_ha
)->mvi
[i
];
633 kfree(sha
->sas_port
);
635 pci_release_regions(pdev
);
636 pci_disable_device(pdev
);
640 static struct pci_device_id __devinitdata mvs_pci_table
[] = {
641 { PCI_VDEVICE(MARVELL
, 0x6320), chip_6320
},
642 { PCI_VDEVICE(MARVELL
, 0x6340), chip_6440
},
644 .vendor
= PCI_VENDOR_ID_MARVELL
,
646 .subvendor
= PCI_ANY_ID
,
650 .driver_data
= chip_6485
,
652 { PCI_VDEVICE(MARVELL
, 0x6440), chip_6440
},
653 { PCI_VDEVICE(MARVELL
, 0x6485), chip_6485
},
654 { PCI_VDEVICE(MARVELL
, 0x9480), chip_9480
},
655 { PCI_VDEVICE(MARVELL
, 0x9180), chip_9180
},
657 { } /* terminate list */
660 static struct pci_driver mvs_pci_driver
= {
662 .id_table
= mvs_pci_table
,
663 .probe
= mvs_pci_init
,
664 .remove
= __devexit_p(mvs_pci_remove
),
668 struct task_struct
*mvs_th
;
669 static int __init
mvs_init(void)
672 mvs_stt
= sas_domain_attach_transport(&mvs_transport_ops
);
676 rc
= pci_register_driver(&mvs_pci_driver
);
684 sas_release_transport(mvs_stt
);
688 static void __exit
mvs_exit(void)
690 pci_unregister_driver(&mvs_pci_driver
);
691 sas_release_transport(mvs_stt
);
694 module_init(mvs_init
);
695 module_exit(mvs_exit
);
697 MODULE_AUTHOR("Jeff Garzik <jgarzik@pobox.com>");
698 MODULE_DESCRIPTION("Marvell 88SE6440 SAS/SATA controller driver");
699 MODULE_VERSION(DRV_VERSION
);
700 MODULE_LICENSE("GPL");
702 MODULE_DEVICE_TABLE(pci
, mvs_pci_table
);