22 #include <linux/module.h>
23 #include <linux/types.h>
24 #include <linux/pci.h>
27 #include <linux/kernel.h>
28 #include <linux/slab.h>
43 #include <asm/uaccess.h>
47 #define SMART2_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
49 #define DRIVER_NAME "Compaq SMART2 Driver (v 2.6.0)"
50 #define DRIVER_VERSION SMART2_DRIVER_VERSION(2,6,0)
63 #define READ_AHEAD 128
69 #define CPQARRAY_DMA_MASK 0xFFFFFFFF
77 #define NR_PRODUCTS ARRAY_SIZE(products)
84 { 0x0040110E,
"IDA", &smart1_access },
85 { 0x0140110E,
"IDA-2", &smart1_access },
86 { 0x1040110E,
"IAES", &smart1_access },
87 { 0x2040110E,
"SMART", &smart1_access },
88 { 0x3040110E,
"SMART-2/E", &smart2e_access },
89 { 0x40300E11,
"SMART-2/P", &smart2_access },
90 { 0x40310E11,
"SMART-2SL", &smart2_access },
91 { 0x40320E11,
"Smart Array 3200", &smart2_access },
92 { 0x40330E11,
"Smart Array 3100ES", &smart2_access },
93 { 0x40340E11,
"Smart Array 221", &smart2_access },
94 { 0x40400E11,
"Integrated Array", &smart4_access },
95 { 0x40480E11,
"Compaq Raid LC2", &smart4_access },
96 { 0x40500E11,
"Smart Array 4200", &smart4_access },
97 { 0x40510E11,
"Smart Array 4250ES", &smart4_access },
98 { 0x40580E11,
"Smart Array 431", &smart4_access },
105 0x0E11, 0x4058, 0, 0, 0},
107 0x0E11, 0x4051, 0, 0, 0},
109 0x0E11, 0x4050, 0, 0, 0},
111 0x0E11, 0x4048, 0, 0, 0},
113 0x0E11, 0x4040, 0, 0, 0},
115 0x0E11, 0x4034, 0, 0, 0},
117 0x0E11, 0x4033, 0, 0, 0},
119 0x0E11, 0x4032, 0, 0, 0},
121 0x0E11, 0x4031, 0, 0, 0},
123 0x0E11, 0x4030, 0, 0, 0},
132 #define DBG(s) do { s } while(0)
134 #define DBGINFO(s) do { } while(0)
136 #define DBGP(s) do { } while(0)
138 #define DBGPX(s) do { } while(0)
142 static int cpqarray_eisa_detect(
void);
143 static int pollcomplete(
int ctlr);
144 static void getgeometry(
int ctlr);
145 static void start_fwbk(
int ctlr);
150 static void free_hba(
int i);
151 static int alloc_cpqarray_hba(
void);
160 unsigned int log_unit );
163 static int ida_release(
struct gendisk *disk,
fmode_t mode);
173 static inline void complete_command(
cmdlist_t *
cmd,
int timeout);
176 static void ida_timer(
unsigned long tdata);
177 static int ida_revalidate(
struct gendisk *disk);
179 static int cpqarray_register_ctlr(
int ctlr,
struct pci_dev *pdev);
181 #ifdef CONFIG_PROC_FS
182 static void ida_procinit(
int i);
184 static void ida_procinit(
int i) {}
187 static inline drv_info_t *get_drv(
struct gendisk *disk)
189 return disk->private_data;
192 static inline ctlr_info_t *get_host(
struct gendisk *disk)
194 return disk->queue->queuedata;
198 static const struct block_device_operations ida_fops = {
200 .open = ida_unlocked_open,
201 .release = ida_release,
203 .getgeo = ida_getgeo,
204 .revalidate_disk= ida_revalidate,
208 #ifdef CONFIG_PROC_FS
217 static void __init ida_procinit(
int i)
219 if (proc_array ==
NULL) {
221 if (!proc_array)
return;
230 static int ida_proc_show(
struct seq_file *
m,
void *
v)
235 #ifdef CPQ_PROC_PRINT_QUEUES
242 " Board ID: 0x%08lx\n"
243 " Firmware Revision: %c%c%c%c\n"
244 " Controller Sig: 0x%08lx\n"
245 " Memory Address: 0x%08lx\n"
246 " I/O Port: 0x%04x\n"
248 " Logical drives: %d\n"
249 " Physical drives: %d\n\n"
250 " Current Q depth: %d\n"
251 " Max Q depth since init: %d\n\n",
255 h->firm_rev[0], h->firm_rev[1], h->firm_rev[2], h->firm_rev[3],
256 (
unsigned long)h->ctlr_sig, (
unsigned long)h->
vaddr,
257 (
unsigned int) h->io_mem_addr, (
unsigned int)h->
intr,
258 h->log_drives, h->phys_drives,
261 seq_puts(m,
"Logical Drive Info:\n");
263 for(i=0; i<h->log_drives; i++) {
265 seq_printf(m,
"ida/c%dd%d: blksz=%d nr_blks=%d\n",
266 ctlr, i, drv->blk_size, drv->nr_blks);
269 #ifdef CPQ_PROC_PRINT_QUEUES
276 while(
c &&
c != h->
reqQ) {
284 while(
c &&
c != h->
cmpQ) {
290 spin_unlock_irqrestore(IDA_LOCK(h->
ctlr),
flags);
292 seq_printf(m,
"nr_allocs = %d\nnr_frees = %d\n",
304 .open = ida_proc_open,
316 if( c->io_mem_addr == 0)
320 c->io_mem_length = 0;
323 static void __devexit cpqarray_remove_one(
int i)
343 hba[i]->cmd_pool_dhandle);
344 kfree(hba[i]->cmd_pool_bits);
345 for(j = 0; j <
NWD; j++) {
346 if (ida_gendisk[i][j]->
flags & GENHD_FL_UP)
351 release_io_mem(hba[i]);
360 if (pci_get_drvdata(pdev) ==
NULL) {
365 tmp_ptr = pci_get_drvdata(pdev);
367 if (hba[i] ==
NULL) {
369 "already been removed \n", i);
372 pci_set_drvdata(pdev,
NULL);
374 cpqarray_remove_one(i);
380 static void __devexit cpqarray_remove_one_eisa (
int i)
382 if (hba[i] ==
NULL) {
384 "already been removed \n", i);
387 cpqarray_remove_one(i);
407 hba[
i]->
access.set_intr_mask(hba[i], 0);
412 hba[i]->
intr, hba[i]->devname);
416 for (j=0; j<
NWD; j++) {
418 if (!ida_gendisk[i][j])
424 &(hba[i]->cmd_pool_dhandle));
429 if (!hba[i]->cmd_pool_bits || !hba[i]->cmd_pool)
442 q->queuedata = hba[
i];
457 hba[
i]->timer.data = (
unsigned long)hba[i];
458 hba[
i]->timer.function = ida_timer;
464 for(j=0; j<
NWD; j++) {
465 struct gendisk *disk = ida_gendisk[
i][
j];
467 sprintf(disk->disk_name,
"ida/c%dd%d", i, j);
470 disk->fops = &ida_fops;
474 set_capacity(disk, drv->
nr_blks);
475 disk->queue = hba[
i]->queue;
476 disk->private_data = drv;
485 kfree(hba[i]->cmd_pool_bits);
486 if (hba[i]->cmd_pool)
488 hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
499 pci_set_drvdata(pdev,
NULL);
500 release_io_mem(hba[i]);
514 " bus %d dev %d func %d\n",
517 i = alloc_cpqarray_hba();
521 sprintf(hba[i]->devname,
"ida%d", i);
524 pci_set_drvdata(pdev, hba[i]);
526 if (cpqarray_pci_init(hba[i], pdev) != 0) {
527 pci_set_drvdata(pdev,
NULL);
528 release_io_mem(hba[i]);
533 return (cpqarray_register_ctlr(i, pdev));
536 static struct pci_driver cpqarray_pci_driver = {
538 .probe = cpqarray_init_one,
540 .id_table = cpqarray_pci_device_id,
547 static int __init cpqarray_init(
void)
549 int num_cntlrs_reg = 0;
556 rc = pci_register_driver(&cpqarray_pci_driver);
559 cpqarray_eisa_detect();
576 static int alloc_cpqarray_hba(
void)
581 if (hba[i] ==
NULL) {
591 " of 8 controllers.\n");
595 static void free_hba(
int i)
610 unsigned long addr[6];
639 pci_read_config_dword(pdev, 0x2c, &board_id);
642 if(!(command & 0x02)) {
644 "cpqarray: controller appears to be disabled\n");
649 printk(
"vendor_id = %x\n", vendor_id);
650 printk(
"device_id = %x\n", device_id);
651 printk(
"command = %x\n", command);
653 printk(
"addr[%d] = %lx\n", i, addr[i]);
654 printk(
"revision = %x\n", revision);
655 printk(
"irq = %x\n", irq);
656 printk(
"cache_line_size = %x\n", cache_line_size);
657 printk(
"latency_timer = %x\n", latency_timer);
658 printk(
"board_id = %x\n", board_id);
666 c->io_mem_addr = addr[
i];
672 printk(
KERN_WARNING "cpqarray I/O memory range already in use addr %lx length = %ld\n", c->io_mem_addr, c->io_mem_length);
674 c->io_mem_length = 0;
695 if (board_id == products[i].board_id) {
701 if (i == NR_PRODUCTS) {
703 " to access the SMART Array controller %08lx\n",
704 (
unsigned long)board_id);
720 return (page_remapped ? (page_remapped + page_offs) :
NULL);
727 static int cpqarray_setup(
char *
str)
733 for(i=0; i<ints[0] && i<8; i++)
738 __setup(
"smart2=", cpqarray_setup);
745 static int __devinit cpqarray_eisa_detect(
void)
753 while(i<8 && eisa[i]) {
754 ctlr = alloc_cpqarray_hba();
757 board_id =
inl(eisa[i]+0xC80);
759 if (board_id == products[j].board_id)
762 if (j == NR_PRODUCTS) {
764 " to access the SMART Array controller %08lx\n", (
unsigned long)board_id);
769 hba[ctlr]->io_mem_addr = eisa[
i];
770 hba[ctlr]->io_mem_length = 0x7FF;
772 hba[ctlr]->io_mem_length,
776 "use addr = %lx length = %ld\n",
777 hba[ctlr]->io_mem_addr,
778 hba[ctlr]->io_mem_length);
786 intr =
inb(eisa[i]+0xCC0) >> 4;
787 if (intr & 1) intr = 11;
788 else if (intr & 2) intr = 10;
789 else if (intr & 4) intr = 14;
790 else if (intr & 8) intr = 15;
793 sprintf(hba[ctlr]->devname,
"ida%d", nr_ctlr);
796 hba[ctlr]->
ctlr = ctlr;
798 hba[ctlr]->pci_dev =
NULL;
801 printk(
"i = %d, j = %d\n", i, j);
802 printk(
"irq = %x\n", intr);
803 printk(
"product name = %s\n", products[j].product_name);
804 printk(
"board_id = %x\n", board_id);
810 if (cpqarray_register_ctlr(ctlr,
NULL) == -1)
812 "cpqarray: Can't register EISA controller %d\n",
850 ret = ida_open(bdev, mode);
859 static int ida_release(
struct gendisk *disk,
fmode_t mode)
864 host = get_host(disk);
880 c->
prev = (*Qptr)->prev;
882 (*Qptr)->prev->next =
c;
889 if (c && c->
next != c) {
890 if (*Qptr == c) *Qptr = c->
next;
921 if ((c = cmd_alloc(h,1)) ==
NULL)
934 printk(
"sector=%d, nr_sectors=%u\n",
935 blk_rq_pos(creq), blk_rq_sectors(creq));
941 if (rq_data_dir(creq) ==
READ)
945 for( i=0; i <
seg; i++)
951 tmp_sg[
i].length, dir);
953 DBGPX(
printk(
"Submitting %u sectors in %d segments\n", blk_rq_sectors(creq), seg); );
983 if (h->
access.fifo_full(h) == 0)
987 removeQ(&h->
reqQ, c);
991 h->
access.submit_command(h, c);
1001 static inline void complete_command(
cmdlist_t *
cmd,
int timeout)
1019 printk(
KERN_WARNING "Invalid request on ida/c%dd%d = (cmd=%x sect=%d cnt=%d sg=%d ret=%x)\n",
1033 pci_unmap_page(hba[cmd->
ctlr]->pci_dev, cmd->
req.
sg[i].
addr,
1049 unsigned long istat;
1050 unsigned long flags;
1053 istat = h->
access.intr_pending(h);
1064 while((a = h->
access.command_completed(h))) {
1081 removeQ(&h->
cmpQ, c);
1092 complete_command(c, 0);
1105 do_ida_request(h->queue);
1106 spin_unlock_irqrestore(IDA_LOCK(h->
ctlr), flags);
1116 static void ida_timer(
unsigned long tdata)
1146 static int ida_locked_ioctl(
struct block_device *bdev,
fmode_t mode,
unsigned int cmd,
unsigned long arg)
1168 error = ida_ctlr_ioctl(host, drv - host->
drv, my_io);
1179 if (!arg)
return -
EINVAL;
1180 if (
put_user(host->ctlr_sig, (
int __user *)arg))
1186 return revalidate_allvol(host);
1188 if (!arg)
return -
EINVAL;
1197 if (!arg)
return -
EINVAL;
1198 pciinfo.
bus = host->pci_dev->bus->number;
1199 pciinfo.
dev_fn = host->pci_dev->devfn;
1214 unsigned int cmd,
unsigned long param)
1219 ret = ida_locked_ioctl(bdev, mode, cmd, param);
1240 unsigned long flags;
1243 if ((c = cmd_alloc(h, 0)) ==
NULL)
1264 c->
req.
hdr.
blk = pci_map_single(h->pci_dev, &(io->
c),
1268 c->
req.
sg[0].
addr = pci_map_single(h->pci_dev, p,
1284 c->
req.
sg[0].
addr = pci_map_single(h->pci_dev, p,
1300 c->
req.
sg[0].
addr = pci_map_single(h->pci_dev, p,
1306 c->
req.
sg[0].
addr = pci_map_single(h->pci_dev,&io->
c,
1316 spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
1328 pci_unmap_single(h->pci_dev, c->
req.
hdr.
blk,
1367 if (!get_from_pool) {
1392 if (!got_from_pool) {
1414 unsigned int blkcnt,
1415 unsigned int log_unit )
1423 c = cmd_alloc(info_p, 1);
1452 info_p->
access.set_intr_mask(info_p, 0);
1455 for (i = 200000; i > 0; i--) {
1456 temp = info_p->
access.fifo_full(info_p);
1463 " waiting!\n", ctlr);
1469 info_p->
access.submit_command(info_p, c);
1470 complete = pollcomplete(ctlr);
1474 if (complete != 1) {
1477 "cpqarray ida%d: idaSendPciCmd "
1478 "Invalid command list address returned! (%08lx)\n",
1479 ctlr, (
unsigned long)complete);
1480 cmd_free(info_p, c, 1);
1485 "cpqarray ida%d: idaSendPciCmd Timeout out, "
1486 "No command list address returned!\n",
1488 cmd_free(info_p, c, 1);
1495 "cpqarray ida%d: idaSendPciCmd, error: "
1496 "Controller failed at init time "
1497 "cmd: 0x%x, return code = 0x%x\n",
1500 cmd_free(info_p, c, 1);
1504 cmd_free(info_p, c, 1);
1521 int ctlr = host->
ctlr;
1523 unsigned long flags;
1527 spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
1533 spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
1539 set_capacity(ida_gendisk[ctlr][0], 0);
1540 for (i = 1; i <
NWD; i++) {
1541 struct gendisk *disk = ida_gendisk[ctlr][
i];
1542 if (disk->flags & GENHD_FL_UP)
1552 host->
access.set_intr_mask(host, 0);
1554 host->
access.set_intr_mask(host, FIFO_NOT_EMPTY);
1556 for(i=0; i<
NWD; i++) {
1557 struct gendisk *disk = ida_gendisk[ctlr][
i];
1562 set_capacity(disk, drv->
nr_blks);
1563 disk->queue = host->queue;
1564 disk->private_data = drv;
1573 static int ida_revalidate(
struct gendisk *disk)
1576 set_capacity(disk, drv->
nr_blks);
1586 static int pollcomplete(
int ctlr)
1593 for (i = 200000; i > 0; i--) {
1594 done = hba[ctlr]->
access.command_completed(hba[ctlr]);
1610 static void start_fwbk(
int ctlr)
1615 if( (hba[ctlr]->board_id != 0x40400E11)
1616 && (hba[ctlr]->board_id != 0x40480E11) )
1625 if(id_ctlr_buf==
NULL)
1628 "Unable to start background processing.\n");
1632 id_ctlr_buf, 0, 0, 0, 0);
1633 if(ret_code !=
IO_OK)
1635 " background processing\n");
1645 static void getgeometry(
int ctlr)
1651 unsigned int log_unit, log_index;
1657 info_p->log_drv_map = 0;
1672 if (!id_lstatus_buf) {
1678 if (!sense_config_buf) {
1683 info_p->phys_drives = 0;
1684 info_p->log_drv_map = 0;
1685 info_p->drv_assign_map = 0;
1686 info_p->drv_spare_map = 0;
1687 info_p->mp_failed_drv_map = 0;
1689 ret_code = sendcmd(
ID_CTLR, ctlr, id_ctlr_buf, 0, 0, 0, 0);
1700 info_p->log_drives = id_ctlr_buf->
nr_drvs;
1702 info_p->firm_rev[i] = id_ctlr_buf->
firm_rev[i];
1703 info_p->ctlr_sig = id_ctlr_buf->
cfg_sig;
1713 if (id_ctlr_buf->
nr_drvs > 16)
1715 "16 logical drives per controller.\n. "
1716 " Additional drives will not be "
1717 "detected\n", ctlr);
1720 (log_index < id_ctlr_buf->
nr_drvs)
1721 && (log_unit < NWD);
1729 ctlr, id_lstatus_buf, size, 0, 0, log_unit);
1737 info_p->log_drv_map = 0;
1739 "cpqarray ida%d: idaGetGeometry - Controller"
1740 " failed to report status of logical drive %d\n"
1741 "Access to this controller has been disabled\n",
1749 ret_code = sendcmd(
ID_LOG_DRV, ctlr, id_ldrive,
1757 drv = &info_p->
drv[log_unit];
1763 info_p->log_drv_map |= (1 << log_unit);
1768 ctlr, sense_config_buf,
1771 info_p->log_drv_map = 0;
1776 info_p->phys_drives =
1778 info_p->drv_assign_map
1780 info_p->drv_assign_map
1782 info_p->drv_spare_map
1785 log_index = log_index + 1;
1791 kfree(sense_config_buf);
1793 kfree(id_lstatus_buf);
1802 static void __exit cpqarray_exit(
void)
1810 if (hba[i] !=
NULL) {
1812 "controller %d\n", i);
1813 cpqarray_remove_one_eisa(i);