82 #include <linux/module.h>
83 #include <linux/errno.h>
85 #include <linux/pci.h>
89 #include <linux/stat.h>
90 #include <linux/kernel.h>
92 #include <linux/string.h>
95 #include <linux/slab.h>
100 #include <scsi/scsi.h>
108 #define SENSE_SIZE 14
110 #define i91u_MAXQUEUE 2
111 #define i91u_REVID "Initio INI-9X00U/UW SCSI device driver; Revision: 1.04a"
113 #define I950_DEVICE_ID 0x9500
114 #define I940_DEVICE_ID 0x9400
115 #define I935_DEVICE_ID 0x9401
116 #define I920_DEVICE_ID 0x0002
122 static int initio_tag_enable = 1;
125 static int setup_debug = 0;
128 static void i91uSCBPost(
u8 * pHcb,
u8 * pScb);
141 #define DEBUG_INTERRUPT 0
142 #define DEBUG_QUEUE 0
143 #define DEBUG_STATE 0
192 static void initio_se2_ew_en(
unsigned long base);
193 static void initio_se2_ew_ds(
unsigned long base);
194 static int initio_se2_rd_all(
unsigned long base);
195 static void initio_se2_update_all(
unsigned long base);
196 static void initio_read_eeprom(
unsigned long base);
200 static NVRAM i91unvram;
201 static NVRAM *i91unvramp;
203 static u8 i91udftNvRam[64] =
239 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
243 static u8 initio_rate_tbl[8] =
256 static void initio_do_pause(
unsigned amount)
259 unsigned long the_time =
jiffies + amount;
306 static void initio_se2_instr(
unsigned long base,
u8 instr)
316 for (i = 0; i < 8; i++) {
338 void initio_se2_ew_en(
unsigned long base)
340 initio_se2_instr(base, 0x30);
352 void initio_se2_ew_ds(
unsigned long base)
354 initio_se2_instr(base, 0);
367 static u16 initio_se2_rd(
unsigned long base,
u8 addr)
373 instr = (
u8) (addr | 0x80);
374 initio_se2_instr(base, instr);
376 for (i = 15; i >= 0; i--) {
402 static void initio_se2_wr(
unsigned long base,
u8 addr,
u16 val)
408 instr = (
u8) (addr | 0x40);
409 initio_se2_instr(base, instr);
410 for (i = 15; i >= 0; i--) {
447 static int initio_se2_rd_all(
unsigned long base)
453 i91unvramp = &i91unvram;
454 np = (
u16 *) i91unvramp;
455 for (i = 0; i < 32; i++)
456 *np++ = initio_se2_rd(base, i);
462 np = (
u16 *) i91unvramp;
463 for (i = 0; i < 31; i++)
477 static void initio_se2_update_all(
unsigned long base)
483 i91unvramp = &i91unvram;
485 np = (
u16 *) i91udftNvRam;
486 for (i = 0; i < 31; i++)
489 initio_se2_ew_en(base);
491 np = (
u16 *) i91udftNvRam;
492 np1 = (
u16 *) i91unvramp;
493 for (i = 0; i < 32; i++, np++, np1++) {
495 initio_se2_wr(base, i, *np);
497 initio_se2_ew_ds(base);
513 static void initio_read_eeprom(
unsigned long base)
517 i91unvramp = &i91unvram;
521 if (initio_se2_rd_all(base) != 1) {
522 initio_se2_update_all(base);
523 initio_se2_rd_all(base);
570 initio_do_pause(seconds *
HZ);
589 static void initio_init(
struct initio_host * host,
u8 *bios_addr)
596 initio_read_eeprom(host->
addr);
615 initio_stop_bm(host);
647 heads = bios_addr + 0x180;
658 if (host->
targets[i].heads == 255)
662 host->
targets[
i].sectors = *heads++;
667 printk(
"i91u: PCI Base=0x%04X, IRQ=%d, BIOS=0x%04X0, SCSI ID=%d\n",
673 initio_reset_scsi(host, 10);
694 printk(
"find scb at %p\n", scb);
701 spin_unlock_irqrestore(&host->
avail_lock, flags);
718 printk(
"Release SCB %p; ", cmnd);
731 spin_unlock_irqrestore(&(host->
avail_lock), flags);
739 printk(
"Append pend SCB %p; ", scbp);
757 printk(
"Push pend SCB %p; ", scbp);
774 while (first !=
NULL) {
800 printk(
"unlink pend SCB %p; ", scb);
804 while (tmp !=
NULL) {
826 printk(
"append busy SCB %p; ", scbp);
859 printk(
"Pop busy SCB %p; ", tmp);
870 printk(
"unlink busy SCB %p; ", scb);
874 while (tmp !=
NULL) {
904 while (tmp !=
NULL) {
905 scbp_tarlun = (tmp->
lun << 8) | (tmp->
target);
906 if (scbp_tarlun == tarlun) {
913 printk(
"find busy SCB %p; ", tmp);
921 printk(
"append done SCB %p; ", scbp);
945 printk(
"find done SCB %p; ",tmp);
970 while (tmp !=
NULL) {
972 if (tmp->
srb == srbp) {
973 if (tmp == host->
active) {
987 (*tmp->
post) ((
u8 *) host, (
u8 *) tmp);
996 while (tmp !=
NULL) {
997 if (tmp->
srb == srbp) {
998 if (tmp == host->
active) {
1001 }
else if (tmp->
tagmsg == 0) {
1002 spin_unlock_irqrestore(&host->
semaph_lock, flags);
1020 (*tmp->
post) ((
u8 *) host, (
u8 *) tmp);
1021 spin_unlock_irqrestore(&host->
semaph_lock, flags);
1028 spin_unlock_irqrestore(&host->
semaph_lock, flags);
1033 static int initio_bad_seq(
struct initio_host * host)
1040 initio_unlink_busy_scb(host, scb);
1043 initio_append_done_scb(host, scb);
1045 initio_stop_bm(host);
1046 initio_reset_scsi(host, 8);
1047 return initio_post_scsi_rst(host);
1054 unsigned long flags;
1063 initio_append_pend_scb(host, scb);
1070 spin_unlock_irqrestore(&host->
semaph_lock, flags);
1078 spin_unlock_irqrestore(&host->
semaph_lock, flags);
1109 while ((scb = initio_find_done_scb(host)) !=
NULL) {
1114 initio_append_pend_scb(host, scb);
1143 initio_push_pend_scb(host, scb);
1158 (*scb->
post) ((
u8 *) host, (
u8 *) scb);
1167 if (initio_find_first_pend_scb(host) ==
NULL)
1184 int_initio_scsi_rst(host);
1188 if (int_initio_resel(host) == 0)
1189 initio_next_state(host);
1193 int_initio_busfree(host);
1197 int_initio_busfree(host);
1202 initio_next_state(host);
1209 if ((scb = initio_find_first_pend_scb(host)) ==
NULL)
1225 initio_select_atn_stop(host, scb);
1228 initio_select_atn_stop(host, scb);
1231 initio_select_atn3(host, scb);
1233 initio_select_atn(host, scb);
1237 while (wait_tulip(host) != -1) {
1238 if (initio_next_state(host) == -1)
1243 initio_select_atn_stop(host, scb);
1246 while (wait_tulip(host) != -1) {
1247 if (initio_next_state(host) == -1)
1252 if (initio_abort_srb(host, scb->
srb) != 0) {
1253 initio_unlink_pend_scb(host, scb);
1254 initio_release_scb(host, scb);
1257 initio_select_atn_stop(host, scb);
1261 initio_unlink_pend_scb(host, scb);
1263 initio_append_done_scb(host, scb);
1278 static int initio_next_state(
struct initio_host * host)
1282 next = host->
active->next_state;
1286 next = initio_state_1(host);
1289 next = initio_state_2(host);
1292 next = initio_state_3(host);
1295 next = initio_state_4(host);
1298 next = initio_state_5(host);
1301 next = initio_state_6(host);
1304 next = initio_state_7(host);
1307 return initio_bus_device_reset(host);
1309 return initio_bad_seq(host);
1324 static int initio_state_1(
struct initio_host * host)
1333 initio_unlink_pend_scb(host, scb);
1334 initio_append_busy_scb(host, scb);
1361 if (wait_tulip(host) == -1)
1379 static int initio_state_2(
struct initio_host * host)
1387 initio_unlink_pend_scb(host, scb);
1388 initio_append_busy_scb(host, scb);
1408 static int initio_state_3(
struct initio_host * host)
1418 switch (host->
phase) {
1423 if (wait_tulip(host) == -1)
1426 return initio_bad_seq(host);
1431 if (initio_msgin(host) == -1)
1436 if (initio_status_msg(host) == -1)
1444 if (wait_tulip(host) == -1)
1455 if (wait_tulip(host) == -1)
1463 return initio_bad_seq(host);
1475 static int initio_state_4(
struct initio_host * host)
1489 switch (host->
phase) {
1494 if ((initio_status_msg(host)) == -1)
1500 if (initio_msgin(host) == -1)
1508 if (initio_msgout_ide(host) == -1)
1514 if (wait_tulip(host) == -1)
1520 return initio_xfer_data_in(host);
1523 return initio_xfer_data_out(host);
1526 return initio_bad_seq(host);
1539 static int initio_state_5(
struct initio_host * host)
1578 if (wait_tulip(host) == -1)
1598 for (i = scb->
sgidx; i < scb->sgmax; sgp++, i++) {
1628 static int initio_state_6(
struct initio_host * host)
1636 switch (host->
phase) {
1638 if ((initio_status_msg(host)) == -1)
1644 if ((initio_msgin(host)) == -1)
1651 if (wait_tulip(host) == -1)
1656 return initio_xpad_in(host);
1659 return initio_xpad_out(host);
1662 return initio_bad_seq(host);
1683 for (i = 0; i <
cnt; i++)
1686 switch (host->
phase) {
1689 return initio_bad_seq(host);
1703 static int initio_xfer_data_in(
struct initio_host * host)
1735 static int initio_xfer_data_out(
struct initio_host * host)
1773 if (wait_tulip(host) == -1)
1798 if ((wait_tulip(host)) == -1)
1814 if (wait_tulip(host) == -1)
1826 return wait_tulip(host);
1831 if ((initio_msgin_accept(host)) == -1)
1834 return initio_bad_seq(host);
1837 return wait_tulip(host);
1841 if ((scb->
tastat & 0x18) == 0x10)
1842 return initio_bad_seq(host);
1845 return initio_wait_done_disc(host);
1849 if ((scb->
tastat & 0x18) == 0x10)
1850 return initio_msgin_accept(host);
1853 return initio_bad_seq(host);
1864 initio_unlink_pend_scb(host, scb);
1866 initio_append_done_scb(host, scb);
1868 initio_unlink_busy_scb(host, scb);
1870 initio_append_done_scb(host, scb);
1892 static int int_initio_scsi_rst(
struct initio_host * host)
1906 while ((scb = initio_pop_busy_scb(host)) !=
NULL) {
1908 initio_append_done_scb(host, scb);
1914 for (i = 0; i < host->
max_tar; i++)
1946 active_tc = &host->
targets[tar];
1953 if ((initio_msgin_accept(host)) == -1)
1959 if (wait_tulip(host) == -1)
1966 if (initio_msgin_accept(host) == -1)
1974 if (wait_tulip(host) == -1)
1978 if (scb->
target != tar || scb->
lun != lun) {
1979 return initio_msgout_abort_tag(host);
1982 return initio_msgout_abort_tag(host);
1985 if ((initio_msgin_accept(host)) == -1)
1989 if ((scb = initio_find_busy_scb(host, tar | (lun << 8))) ==
NULL) {
1990 return initio_msgout_abort_targ(host);
1994 if ((initio_msgin_accept(host)) == -1)
2009 static int int_initio_bad_seq(
struct initio_host * host)
2014 initio_reset_scsi(host, 10);
2016 while ((scb = initio_pop_busy_scb(host)) !=
NULL) {
2018 initio_append_done_scb(host, scb);
2020 for (i = 0; i < host->
max_tar; i++)
2034 static int initio_msgout_abort_targ(
struct initio_host * host)
2038 if (initio_msgin_accept(host) == -1)
2041 return initio_bad_seq(host);
2046 return initio_wait_disc(host);
2057 static int initio_msgout_abort_tag(
struct initio_host * host)
2061 if (initio_msgin_accept(host) == -1)
2064 return initio_bad_seq(host);
2069 return initio_wait_disc(host);
2079 static int initio_msgin(
struct initio_host * host)
2088 if (wait_tulip(host) == -1)
2094 return initio_wait_disc(host);
2098 initio_msgin_accept(host);
2107 initio_msgin_accept(host);
2110 initio_msgin_extend(host);
2113 initio_msgin_accept(host);
2118 return initio_wait_done_disc(host);
2120 initio_msgout_reject(host);
2129 static int initio_msgout_reject(
struct initio_host * host)
2133 if (initio_msgin_accept(host) == -1)
2139 return wait_tulip(host);
2144 static int initio_msgout_ide(
struct initio_host * host)
2148 return wait_tulip(host);
2151 static int initio_msgin_extend(
struct initio_host * host)
2155 if (initio_msgin_accept(host) !=
MSG_IN)
2161 if (wait_tulip(host) == -1)
2166 for (idx = 1; len != 0; len--) {
2168 if ((initio_msgin_accept(host)) !=
MSG_IN)
2172 if (wait_tulip(host) == -1)
2176 if (host->
msg[1] == 1) {
2178 if (host->
msg[0] != 3)
2179 return initio_msgout_reject(host);
2183 if (initio_msgin_sync(host) == 0 &&
2185 initio_sync_done(host);
2186 return initio_msgin_accept(host);
2193 if (initio_msgin_accept(host) !=
MSG_OUT)
2198 initio_sync_done(host);
2206 return wait_tulip(host);
2208 if (host->
msg[0] != 2 || host->
msg[1] != 3)
2209 return initio_msgout_reject(host);
2214 if (host->
msg[2] > 2)
2215 return initio_msgout_reject(host);
2216 if (host->
msg[2] == 2) {
2223 return initio_msgin_accept(host);
2229 if (initio_msgin_accept(host) !=
MSG_OUT)
2237 return wait_tulip(host);
2240 static int initio_msgin_sync(
struct initio_host * host)
2242 char default_period;
2247 if (host->
msg[2] < default_period) {
2248 host->
msg[2] = default_period;
2251 if (host->
msg[2] >= 59)
2256 if (host->
msg[3] == 0) {
2259 if (host->
msg[2] < default_period) {
2260 host->
msg[2] = default_period;
2263 if (host->
msg[2] >= 59) {
2285 static int initio_sync_done(
struct initio_host * host)
2293 for (i = 0; i < 8; i++) {
2294 if (initio_rate_tbl[i] >= host->
msg[2])
2307 static int initio_post_scsi_rst(
struct initio_host * host)
2317 while ((scb = initio_pop_busy_scb(host)) !=
NULL) {
2319 initio_append_done_scb(host, scb);
2322 active_tc = &host->
targets[0];
2323 for (i = 0; i < host->
max_tar; active_tc++, i++) {
2370 for (i = 0; i < scb->
cdblen; i++)
2384 int initio_bus_device_reset(
struct initio_host * host)
2392 return int_initio_bad_seq(host);
2394 initio_unlink_pend_scb(host, scb);
2395 initio_release_scb(host, scb);
2404 while (tmp !=
NULL) {
2405 if (tmp->
target == tar) {
2416 initio_append_done_scb(host, tmp);
2426 return initio_wait_disc(host);
2430 static int initio_msgin_accept(
struct initio_host * host)
2433 return wait_tulip(host);
2448 return int_initio_resel(host);
2450 return int_initio_busfree(host);
2452 return int_initio_scsi_rst(host);
2457 initio_unlink_busy_scb(host, host->
active);
2458 host->
active->hastat = 0;
2459 initio_append_done_scb(host, host->
active);
2476 return int_initio_busfree(host);
2484 static int initio_wait_disc(
struct initio_host * host)
2492 return int_initio_scsi_rst(host);
2500 return initio_bad_seq(host);
2503 static int initio_wait_done_disc(
struct initio_host * host)
2512 return int_initio_scsi_rst(host);
2517 initio_unlink_busy_scb(host, host->
active);
2519 initio_append_done_scb(host, host->
active);
2523 return initio_bad_seq(host);
2538 unsigned long flags;
2542 r = initio_isr((
struct initio_host *)dev->hostdata);
2543 spin_unlock_irqrestore(dev->
host_lock, flags);
2571 cblk->
post = i91uSCBPost;
2596 if (cmnd->
device->tagged_supported) {
2625 total_len : scsi_bufflen(cmnd);
2642 static int i91u_queuecommand_lck(
struct scsi_cmnd *
cmd,
2650 cmnd = initio_alloc_scb(host);
2654 initio_build_scb(host, cmnd, cmd);
2655 initio_exec_scb(host, cmnd);
2672 host = (
struct initio_host *) cmnd->device->host->hostdata;
2674 spin_lock_irq(cmnd->device->host->host_lock);
2675 initio_reset_scsi(host, 0);
2676 spin_unlock_irq(cmnd->device->host->host_lock);
2704 info_array[0] = tc->
heads;
2709 info_array[0] = 255;
2711 info_array[2] = (
unsigned long)capacity / 255 / 63;
2715 info_array[2] = (
unsigned long)capacity >> 11;
2719 #if defined(DEBUG_BIOSPARAM)
2720 if (i91u_debug & debug_biosparam) {
2721 printk(
"bios geometry: head=%d, sec=%d, cyl=%d\n",
2722 info_array[0], info_array[1], info_array[2]);
2723 printk(
"WARNING: check, if the bios geometry is correct.\n");
2742 if (cmnd->
SCp.ptr) {
2750 if (scsi_sg_count(cmnd)) {
2768 static void i91uSCBPost(
u8 * host_mem,
u8 * cblk_mem)
2776 if ((cmnd = cblk->
srb) ==
NULL) {
2779 initio_release_scb(host, cblk);
2822 i91u_unmap_scb(host->
pci_dev, cmnd);
2824 initio_release_scb(host, cblk);
2828 .proc_name =
"INI9100U",
2829 .name =
"Initio INI-9X00U/UW SCSI device driver",
2830 .queuecommand = i91u_queuecommand,
2831 .eh_bus_reset_handler = i91u_bus_reset,
2832 .bios_param = i91u_biosparam,
2840 static int initio_probe_one(
struct pci_dev *pdev,
2854 pci_read_config_dword(pdev, 0x44, (
u32 *) & reg);
2855 bios_seg = (
u16) (reg & 0xFF);
2856 if (((reg & 0xFF00) >> 8) == 0xFF)
2858 bios_seg = (bios_seg << 8) + ((u16) ((reg & 0xFF00) >> 8));
2863 goto out_disable_device;
2869 goto out_disable_device;
2882 if (initio_tag_enable)
2896 goto out_release_region;
2907 for (i = 0, tmp = scb; i < num_scb; i++, tmp++) {
2940 pci_set_drvdata(pdev, shost);
2942 error = scsi_add_host(shost, &pdev->
dev);
2968 static void initio_remove_one(
struct pci_dev *pdev)
2970 struct Scsi_Host *host = pci_get_drvdata(pdev);
2991 static struct pci_driver initio_pci_driver = {
2993 .id_table = initio_pci_tbl,
2994 .probe = initio_probe_one,
2998 static int __init initio_init_driver(
void)
3000 return pci_register_driver(&initio_pci_driver);
3003 static void __exit initio_exit_driver(
void)