37 #include <asm/uaccess.h>
42 #include <linux/reboot.h>
43 #include <linux/module.h>
44 #include <linux/list.h>
46 #include <linux/pci.h>
50 #include <linux/slab.h>
58 #define MEGARAID_MODULE_VERSION "2.00.4"
68 MODULE_PARM_DESC(max_cmd_per_lun,
"Maximum number of commands which can be issued to a single LUN (default=DEF_CMD_PER_LUN=63)");
72 MODULE_PARM_DESC(max_sectors_per_io,
"Maximum number of sectors per I/O request (default=MAX_SECTORS_PER_IO=128)");
77 MODULE_PARM_DESC(max_mbox_busy_wait,
"Maximum wait for mailbox in microseconds if busy (default=MBOX_BUSY_WAIT=10)");
79 #define RDINDOOR(adapter) readl((adapter)->mmio_base + 0x20)
80 #define RDOUTDOOR(adapter) readl((adapter)->mmio_base + 0x2C)
81 #define WRINDOOR(adapter,value) writel(value, (adapter)->mmio_base + 0x20)
82 #define WROUTDOOR(adapter,value) writel(value, (adapter)->mmio_base + 0x2C)
96 megadev_unlocked_ioctl(
struct file *filep,
unsigned int cmd,
unsigned long arg);
103 .unlocked_ioctl = megadev_unlocked_ioctl,
104 .open = megadev_open,
121 #define IS_RAID_CH(hba, ch) (((hba)->mega_ch_class >> (ch)) & 0x01)
127 static int trace_level;
147 adapter->
mbox = (mbox_t *)((((
unsigned long) adapter->
mbox) + 15) &
150 adapter->
mbox64 = (mbox64_t *)(((
unsigned long)adapter->
mbox) - 8);
152 align = ((
void *)adapter->
mbox) - ((
void *)&adapter->
una_mbox64->mbox);
196 mega_inquiry3 *inquiry3;
203 mbox = (mbox_t *)raw_mbox;
206 memset(&mbox->m_out, 0,
sizeof(raw_mbox));
222 if ((retval = issue_scb_block(adapter, raw_mbox))) {
225 mraid_ext_inquiry *ext_inq;
230 sizeof(mraid_ext_inquiry), &dma_handle);
232 if( ext_inq ==
NULL )
return -1;
234 inq = &ext_inq->raid_inq;
236 mbox->m_out.xferaddr = (
u32)dma_handle;
241 issue_scb_block(adapter, raw_mbox);
247 mega_8_to_40ld(inq, inquiry3,
251 ext_inq, dma_handle);
260 prod_info_dma_handle = pci_map_single(adapter->
dev, (
void *)
264 mbox->m_out.xferaddr = prod_info_dma_handle;
269 if ((retval = issue_scb_block(adapter, raw_mbox)))
271 "megaraid: Product_info cmd failed with error: %d\n",
274 pci_unmap_single(adapter->
dev, prod_info_dma_handle,
282 adapter->
host->max_channel =
285 adapter->
host->max_id = 16;
287 adapter->
host->max_lun = 7;
289 adapter->
host->cmd_per_lun = max_cmd_per_lun;
291 adapter->
numldrv = inquiry3->num_ldrv;
304 mega_get_max_sgl(adapter);
306 adapter->
host->sg_tablesize = adapter->
sglen;
360 __mega_runpendq(adapter);
393 scb = mega_build_cmd(adapter, scmd, &busy);
406 mega_runpendq(adapter);
410 spin_unlock_irqrestore(&adapter->
lock, flags);
431 if( !list_empty(head) ) {
435 list_del_init(head->
next);
467 ldrv_num = (channel * 15) + tgt;
474 if( ldrv_num == 0 ) {
478 if( ldrv_num <= adapter->boot_ldrv ) {
495 switch (cmd->
cmnd[0]) {
522 mega_ext_passthru *epthru;
523 mega_passthru *
pthru;
555 channel = cmd->
device->channel -
560 channel = cmd->
device->channel;
579 channel = cmd->
device->channel;
598 ldrv_num = mega_get_ldrv_num(adapter, cmd, channel);
609 max_ldrv_num += 0x80;
611 if(ldrv_num > max_ldrv_num ) {
619 if( cmd->
device->lun > 7) {
636 switch (cmd->
cmnd[0]) {
638 #if MEGA_HAVE_CLUSTERING
649 if(!(scb = mega_allocate_scb(adapter, cmd))) {
671 sg = scsi_sglist(cmd);
685 if(!(adapter->
flag & (1L << cmd->
device->channel))) {
688 "scsi%d: scanning scsi channel %d ",
689 adapter->
host->host_no,
691 printk(
"for logical drives.\n");
697 if(!(scb = mega_allocate_scb(adapter, cmd))) {
705 memset(pthru, 0,
sizeof(mega_passthru));
709 pthru->reqsenselen = 14;
710 pthru->islogical = 1;
711 pthru->logdrv = ldrv_num;
724 pthru->numsgelements = mega_build_sglist(adapter, scb,
725 &pthru->dataxferaddr, &pthru->dataxferlen);
739 if(!(scb = mega_allocate_scb(adapter, cmd))) {
746 mbox->m_out.logdrv = ldrv_num;
753 mbox->m_out.cmd = (*cmd->
cmnd & 0x02) ?
758 mbox->m_out.cmd = (*cmd->
cmnd & 0x02) ?
767 mbox->m_out.numsectors = (
u32) cmd->
cmnd[4];
773 mbox->m_out.lba &= 0x1FFFFF;
782 adapter->nreads[ldrv_num%0x80]++;
783 adapter->nreadblocks[ldrv_num%0x80] +=
784 mbox->m_out.numsectors;
786 adapter->nwrites[ldrv_num%0x80]++;
787 adapter->nwriteblocks[ldrv_num%0x80] +=
788 mbox->m_out.numsectors;
797 mbox->m_out.numsectors =
808 adapter->nreads[ldrv_num%0x80]++;
809 adapter->nreadblocks[ldrv_num%0x80] +=
810 mbox->m_out.numsectors;
812 adapter->nwrites[ldrv_num%0x80]++;
813 adapter->nwriteblocks[ldrv_num%0x80] +=
814 mbox->m_out.numsectors;
829 mbox->m_out.numsectors =
837 adapter->nreads[ldrv_num%0x80]++;
838 adapter->nreadblocks[ldrv_num%0x80] +=
839 mbox->m_out.numsectors;
841 adapter->nwrites[ldrv_num%0x80]++;
842 adapter->nwriteblocks[ldrv_num%0x80] +=
843 mbox->m_out.numsectors;
851 if( (*cmd->
cmnd & 0x0F) == 0x08 ) {
859 mbox->m_out.numsgelements = mega_build_sglist(adapter, scb,
860 (
u32 *)&mbox->m_out.xferaddr, &seg);
864 #if MEGA_HAVE_CLUSTERING
879 if(!(scb = mega_allocate_scb(adapter, cmd))) {
907 if(!(scb = mega_allocate_scb(adapter, cmd))) {
917 epthru = mega_prepare_extpassthru(adapter, scb, cmd,
927 pthru = mega_prepare_passthru(adapter, scb, cmd,
957 static mega_passthru *
959 int channel,
int target)
961 mega_passthru *
pthru;
964 memset(pthru, 0,
sizeof (mega_passthru));
970 pthru->reqsenselen = 14;
971 pthru->islogical = 0;
976 (channel << 4) | target :
target;
979 pthru->logdrv = cmd->
device->lun;
987 switch (cmd->
cmnd[0]) {
990 if(!(adapter->
flag & (1L << cmd->
device->channel))) {
993 "scsi%d: scanning scsi channel %d [P%d] ",
994 adapter->
host->host_no,
995 cmd->
device->channel, channel);
996 printk(
"for physical devices.\n");
1002 pthru->numsgelements = mega_build_sglist(adapter, scb,
1003 &pthru->dataxferaddr, &pthru->dataxferlen);
1021 static mega_ext_passthru *
1023 int channel,
int target)
1025 mega_ext_passthru *epthru;
1028 memset(epthru, 0,
sizeof(mega_ext_passthru));
1031 epthru->timeout = 2;
1034 epthru->reqsenselen = 14;
1035 epthru->islogical = 0;
1039 (channel << 4) | target :
target;
1041 epthru->cdblen = cmd->
cmd_len;
1042 epthru->logdrv = cmd->
device->lun;
1049 switch(cmd->
cmnd[0]) {
1052 if(!(adapter->
flag & (1L << cmd->
device->channel))) {
1055 "scsi%d: scanning scsi channel %d [P%d] ",
1056 adapter->
host->host_no,
1057 cmd->
device->channel, channel);
1058 printk(
"for physical devices.\n");
1064 epthru->numsgelements = mega_build_sglist(adapter, scb,
1065 &epthru->dataxferaddr, &epthru->dataxferlen);
1085 if( issue_scb(adapter, scb) != 0 )
1106 volatile mbox64_t *mbox64 = adapter->
mbox64;
1107 volatile mbox_t *mbox = adapter->
mbox;
1114 }
while( mbox->m_in.busy && (i < max_mbox_busy_wait) );
1116 if(mbox->m_in.busy)
return -1;
1123 mbox->m_out.cmdid = scb->
idx;
1124 mbox->m_in.busy = 1;
1132 switch (mbox->m_out.cmd) {
1137 mbox64->xfer_segment_lo = mbox->m_out.xferaddr;
1138 mbox64->xfer_segment_hi = 0;
1139 mbox->m_out.xferaddr = 0xFFFFFFFF;
1142 mbox64->xfer_segment_lo = 0;
1143 mbox64->xfer_segment_hi = 0;
1152 mbox->m_in.poll = 0;
1170 if (adapter->
mbox->m_in.busy)
1171 return __mega_busywait_mbox(adapter);
1185 volatile mbox64_t *mbox64 = adapter->
mbox64;
1186 volatile mbox_t *mbox = adapter->
mbox;
1190 if(mega_busywait_mbox (adapter))
1191 goto bug_blocked_mailbox;
1195 mbox->m_out.cmdid = 0xFE;
1196 mbox->m_in.busy = 1;
1198 switch (raw_mbox[0]) {
1203 mbox64->xfer_segment_lo = mbox->m_out.xferaddr;
1204 mbox64->xfer_segment_hi = 0;
1205 mbox->m_out.xferaddr = 0xFFFFFFFF;
1208 mbox64->xfer_segment_lo = 0;
1209 mbox64->xfer_segment_hi = 0;
1213 mbox->m_in.poll = 0;
1215 mbox->m_in.numstatus = 0xFF;
1216 mbox->m_in.status = 0xFF;
1219 while((
volatile u8)mbox->m_in.numstatus == 0xFF)
1222 mbox->m_in.numstatus = 0xFF;
1224 while( (
volatile u8)mbox->m_in.poll != 0x77 )
1227 mbox->m_in.poll = 0;
1228 mbox->m_in.ack = 0x77;
1247 return mbox->m_in.status;
1249 bug_blocked_mailbox:
1266 megaraid_isr_iomapped(
int irq,
void *devp)
1269 unsigned long flags;
1293 while((nstatus = (
volatile u8)adapter->
mbox->m_in.numstatus)
1296 adapter->
mbox->m_in.numstatus = 0xFF;
1298 status = adapter->
mbox->m_in.status;
1305 memcpy(completed, (
void *)adapter->
mbox->m_in.completed,
1311 mega_cmd_done(adapter, completed, nstatus, status);
1313 mega_rundoneq(adapter);
1319 mega_runpendq(adapter);
1326 spin_unlock_irqrestore(&adapter->
lock, flags);
1342 megaraid_isr_memmapped(
int irq,
void *devp)
1345 unsigned long flags;
1361 if(dword != 0x10001234) {
1369 while((nstatus = (
volatile u8)adapter->
mbox->m_in.numstatus)
1373 adapter->
mbox->m_in.numstatus = 0xFF;
1375 status = adapter->
mbox->m_in.status;
1382 memcpy(completed, (
void *)adapter->
mbox->m_in.completed,
1393 mega_cmd_done(adapter, completed, nstatus, status);
1395 mega_rundoneq(adapter);
1399 mega_runpendq(adapter);
1406 spin_unlock_irqrestore(&adapter->
lock, flags);
1420 mega_cmd_done(
adapter_t *adapter,
u8 completed[],
int nstatus,
int status)
1422 mega_ext_passthru *epthru =
NULL;
1425 mega_passthru *pthru =
NULL;
1426 mbox_t *mbox =
NULL;
1437 for( i = 0; i < nstatus; i++ ) {
1439 cmdid = completed[
i];
1461 "megaraid: invalid command ");
1462 printk(
"Id %d, scb->state:%x, scsi cmd:%p\n",
1474 "megaraid: aborted cmd [%x] complete.\n",
1482 mega_free_scb(adapter, scb);
1493 "megaraid: reset cmd [%x] complete.\n",
1501 mega_free_scb (adapter, scb);
1514 int logdrv = mbox->m_out.logdrv;
1522 if( status && islogical && (cmd->
cmnd[0] ==
READ_6 ||
1529 adapter->rd_errors[
logdrv%0x80]++;
1532 if( status && islogical && (cmd->
cmnd[0] ==
WRITE_6 ||
1539 adapter->wr_errors[
logdrv%0x80]++;
1555 sgl = scsi_sglist(cmd);
1556 if( sg_page(sgl) ) {
1557 c = *(
unsigned char *) sg_virt(&sgl[0]);
1560 "megaraid: invalid sg.\n");
1597 epthru->reqsensearea, 14);
1616 #if MEGA_HAVE_CLUSTERING
1655 list_del_init(&scb->
list);
1659 mega_free_scb(adapter, scb);
1713 list_del_init(&scb->
list);
1724 __mega_busywait_mbox (
adapter_t *adapter)
1726 volatile mbox_t *mbox = adapter->
mbox;
1729 for (counter = 0; counter < 10000; counter++) {
1730 if (!mbox->m_in.busy)
1766 sg = scsi_sglist(cmd);
1798 mega_8_to_40ld(mraid_inquiry *
inquiry, mega_inquiry3 *enquiry3,
1803 product_info->max_commands = inquiry->adapter_info.max_commands;
1804 enquiry3->rebuild_rate = inquiry->adapter_info.rebuild_rate;
1805 product_info->nchannels = inquiry->adapter_info.nchannels;
1807 for (i = 0; i < 4; i++) {
1808 product_info->fw_version[
i] =
1809 inquiry->adapter_info.fw_version[
i];
1811 product_info->bios_version[
i] =
1812 inquiry->adapter_info.bios_version[
i];
1814 enquiry3->cache_flush_interval =
1815 inquiry->adapter_info.cache_flush_interval;
1817 product_info->dram_size = inquiry->adapter_info.dram_size;
1819 enquiry3->num_ldrv = inquiry->logdrv_info.num_ldrv;
1822 enquiry3->ldrv_size[
i] = inquiry->logdrv_info.ldrv_size[
i];
1823 enquiry3->ldrv_prop[
i] = inquiry->logdrv_info.ldrv_prop[
i];
1824 enquiry3->ldrv_state[
i] = inquiry->logdrv_info.ldrv_state[
i];
1828 enquiry3->pdrv_state[i] = inquiry->pdrv_info.pdrv_state[i];
1837 for(i = 0; i < adapter->
max_cmds; i++) {
1843 sizeof(mega_sgl64) * adapter->
sglen,
1859 sizeof(mega_ext_passthru),
1881 "LSI Logic MegaRAID %s %d commands %d targs %d chans %d luns",
1883 adapter->
host->max_id, adapter->
host->max_channel,
1884 adapter->
host->max_lun);
1900 rval = megaraid_abort_and_reset(adapter, cmd,
SCB_ABORT);
1906 mega_rundoneq(adapter);
1925 if( mega_internal_command(adapter, &mc,
NULL) != 0 ) {
1927 "megaraid: reservation reset failed.\n");
1934 spin_lock_irq(&adapter->
lock);
1936 rval = megaraid_abort_and_reset(adapter, cmd,
SCB_RESET);
1942 mega_rundoneq(adapter);
1943 spin_unlock_irq(&adapter->
lock);
1975 if (scb->
cmd == cmd) {
1988 "megaraid: %s[%x], fw owner.\n",
2001 "megaraid: %s-[%x], driver owner.\n",
2005 mega_free_scb(adapter, scb);
2030 if( *pdev ==
NULL )
return -1;
2043 free_local_pdev(
struct pci_dev *pdev)
2055 static inline void *
2069 #ifdef CONFIG_PROC_FS
2072 #define CREATE_READ_PROC(string, func) create_proc_read_entry(string, \
2073 S_IRUSR | S_IFREG, \
2074 controller_proc_dir_entry, \
2088 u8 string[64] = { 0 };
2093 controller_proc_dir_entry =
2094 adapter->controller_proc_dir_entry =
proc_mkdir(
string, parent);
2096 if(!controller_proc_dir_entry) {
2100 adapter->proc_read = CREATE_READ_PROC(
"config", proc_read_config);
2101 adapter->proc_stat = CREATE_READ_PROC(
"stat", proc_read_stat);
2102 adapter->proc_mbox = CREATE_READ_PROC(
"mailbox", proc_read_mbox);
2103 #if MEGA_HAVE_ENH_PROC
2104 adapter->proc_rr = CREATE_READ_PROC(
"rebuild-rate", proc_rebuild_rate);
2105 adapter->proc_battery = CREATE_READ_PROC(
"battery-status",
2111 adapter->proc_pdrvstat[0] = CREATE_READ_PROC(
"diskdrives-ch0",
2113 adapter->proc_pdrvstat[1] = CREATE_READ_PROC(
"diskdrives-ch1",
2115 adapter->proc_pdrvstat[2] = CREATE_READ_PROC(
"diskdrives-ch2",
2117 adapter->proc_pdrvstat[3] = CREATE_READ_PROC(
"diskdrives-ch3",
2124 adapter->proc_rdrvstat[0] = CREATE_READ_PROC(
"raiddrives-0-9",
2126 adapter->proc_rdrvstat[1] = CREATE_READ_PROC(
"raiddrives-10-19",
2128 adapter->proc_rdrvstat[2] = CREATE_READ_PROC(
"raiddrives-20-29",
2130 adapter->proc_rdrvstat[3] = CREATE_READ_PROC(
"raiddrives-30-39",
2158 len +=
sprintf(page+len,
"%s\n",
2161 len +=
sprintf(page+len,
"Controller Type: ");
2165 "438/466/467/471/493/518/520/531/532\n");
2174 "Controller Supports 40 Logical Drives\n");
2179 "Controller capable of 64-bit memory addressing\n");
2183 "Controller using 64-bit memory addressing\n");
2187 "Controller is not using 64-bit memory addressing\n");
2190 len +=
sprintf(page+len,
"Base = %08lx, Irq = %d, ", adapter->
base,
2191 adapter->
host->irq);
2193 len +=
sprintf(page+len,
"Logical Drives = %d, Channels = %d\n",
2196 len +=
sprintf(page+len,
"Version =%s:%s, DRAM = %dMb\n",
2201 "Controller Queue Depth = %d, Driver Queue Depth = %d\n",
2204 len +=
sprintf(page+len,
"support_ext_cdb = %d\n",
2206 len +=
sprintf(page+len,
"support_random_del = %d\n",
2208 len +=
sprintf(page+len,
"boot_ldrv_enabled = %d\n",
2210 len +=
sprintf(page+len,
"boot_ldrv = %d\n",
2212 len +=
sprintf(page+len,
"boot_pdrv_enabled = %d\n",
2214 len +=
sprintf(page+len,
"boot_pdrv_ch = %d\n",
2216 len +=
sprintf(page+len,
"boot_pdrv_tgt = %d\n",
2218 len +=
sprintf(page+len,
"quiescent = %d\n",
2220 len +=
sprintf(page+len,
"has_cluster = %d\n",
2223 len +=
sprintf(page+len,
"\nModule Parameters:\n");
2224 len +=
sprintf(page+len,
"max_cmd_per_lun = %d\n",
2226 len +=
sprintf(page+len,
"max_sectors_per_io = %d\n",
2227 max_sectors_per_io);
2248 proc_read_stat(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2259 len =
sprintf(page,
"Statistical Information for this controller\n");
2260 len +=
sprintf(page+len,
"pend_cmds = %d\n",
2263 for(i = 0; i < adapter->
numldrv; i++) {
2264 len +=
sprintf(page+len,
"Logical Drive %d:\n", i);
2267 "\tReads Issued = %lu, Writes Issued = %lu\n",
2268 adapter->nreads[i], adapter->nwrites[i]);
2271 "\tSectors Read = %lu, Sectors Written = %lu\n",
2272 adapter->nreadblocks[i], adapter->nwriteblocks[i]);
2275 "\tRead errors = %lu, Write errors = %lu\n\n",
2276 adapter->rd_errors[i], adapter->wr_errors[i]);
2280 "IO and error counters not compiled in driver.\n");
2302 proc_read_mbox(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2307 volatile mbox_t *mbox = adapter->
mbox;
2310 len =
sprintf(page,
"Contents of Mail Box Structure\n");
2311 len +=
sprintf(page+len,
" Fw Command = 0x%02x\n",
2313 len +=
sprintf(page+len,
" Cmd Sequence = 0x%02x\n",
2315 len +=
sprintf(page+len,
" No of Sectors= %04d\n",
2316 mbox->m_out.numsectors);
2317 len +=
sprintf(page+len,
" LBA = 0x%02x\n",
2319 len +=
sprintf(page+len,
" DTA = 0x%08x\n",
2320 mbox->m_out.xferaddr);
2321 len +=
sprintf(page+len,
" Logical Drive= 0x%02x\n",
2322 mbox->m_out.logdrv);
2323 len +=
sprintf(page+len,
" No of SG Elmt= 0x%02x\n",
2324 mbox->m_out.numsgelements);
2325 len +=
sprintf(page+len,
" Busy = %01x\n",
2327 len +=
sprintf(page+len,
" Status = 0x%02x\n",
2348 proc_rebuild_rate(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2357 if( make_local_pdev(adapter, &pdev) != 0 ) {
2362 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) ==
NULL ) {
2363 free_local_pdev(pdev);
2368 if( mega_adapinq(adapter, dma_handle) != 0 ) {
2370 len =
sprintf(page,
"Adapter inquiry failed.\n");
2374 mega_free_inquiry(inquiry, dma_handle, pdev);
2376 free_local_pdev(pdev);
2384 len =
sprintf(page,
"Rebuild Rate: [%d%%]\n",
2385 ((mega_inquiry3 *)inquiry)->rebuild_rate);
2388 len =
sprintf(page,
"Rebuild Rate: [%d%%]\n",
2389 ((mraid_ext_inquiry *)
2390 inquiry)->raid_inq.adapter_info.rebuild_rate);
2394 mega_free_inquiry(inquiry, dma_handle, pdev);
2396 free_local_pdev(pdev);
2416 proc_battery(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2423 u8 battery_status = 0;
2427 if( make_local_pdev(adapter, &pdev) != 0 ) {
2432 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) ==
NULL ) {
2433 free_local_pdev(pdev);
2438 if( mega_adapinq(adapter, dma_handle) != 0 ) {
2440 len =
sprintf(page,
"Adapter inquiry failed.\n");
2444 mega_free_inquiry(inquiry, dma_handle, pdev);
2446 free_local_pdev(pdev);
2454 battery_status = ((mega_inquiry3 *)inquiry)->battery_status;
2457 battery_status = ((mraid_ext_inquiry *)inquiry)->
2458 raid_inq.adapter_info.battery_status;
2464 sprintf(str,
"Battery Status:[%d]", battery_status);
2467 strcat(str,
" Charge Done");
2470 strcat(str,
" Module Missing");
2473 strcat(str,
" Low Voltage");
2476 strcat(str,
" Temperature High");
2479 strcat(str,
" Pack Missing");
2482 strcat(str,
" Charge In-progress");
2485 strcat(str,
" Charge Fail");
2488 strcat(str,
" Cycles Exceeded");
2490 len =
sprintf(page,
"%s\n", str);
2493 mega_free_inquiry(inquiry, dma_handle, pdev);
2495 free_local_pdev(pdev);
2515 proc_pdrv_ch0(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2522 return (proc_pdrv(adapter, page, 0));
2538 proc_pdrv_ch1(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2545 return (proc_pdrv(adapter, page, 1));
2561 proc_pdrv_ch2(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2568 return (proc_pdrv(adapter, page, 2));
2584 proc_pdrv_ch3(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2591 return (proc_pdrv(adapter, page, 3));
2603 proc_pdrv(
adapter_t *adapter,
char *page,
int channel)
2618 if( make_local_pdev(adapter, &pdev) != 0 ) {
2622 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) ==
NULL ) {
2626 if( mega_adapinq(adapter, dma_handle) != 0 ) {
2627 len =
sprintf(page,
"Adapter inquiry failed.\n");
2637 if( scsi_inq ==
NULL ) {
2638 len =
sprintf(page,
"memory not available for scsi inq.\n");
2644 pdrv_state = ((mega_inquiry3 *)inquiry)->pdrv_state;
2647 pdrv_state = ((mraid_ext_inquiry *)inquiry)->
2648 raid_inq.pdrv_info.pdrv_state;
2653 if( channel >= max_channels ) {
2659 i = channel*16 + tgt;
2661 state = *(pdrv_state +
i);
2663 switch( state & 0x0F ) {
2667 "Channel:%2d Id:%2d State: Online",
2673 "Channel:%2d Id:%2d State: Failed",
2679 "Channel:%2d Id:%2d State: Rebuild",
2685 "Channel:%2d Id:%2d State: Hot spare",
2691 "Channel:%2d Id:%2d State: Un-configured",
2702 memset(scsi_inq, 0, 256);
2703 if( mega_internal_dev_inquiry(adapter, channel, tgt,
2704 scsi_inq_dma_handle) ||
2715 len +=
sprintf(page+len,
"%s.\n", str);
2717 len += mega_print_inquiry(page+len, scsi_inq);
2723 mega_free_inquiry(inquiry, dma_handle, pdev);
2725 free_local_pdev(pdev);
2735 mega_print_inquiry(
char *page,
char *scsi_inq)
2740 len =
sprintf(page,
" Vendor: ");
2741 for( i = 8; i < 16; i++ ) {
2742 len +=
sprintf(page+len,
"%c", scsi_inq[i]);
2745 len +=
sprintf(page+len,
" Model: ");
2747 for( i = 16; i < 32; i++ ) {
2748 len +=
sprintf(page+len,
"%c", scsi_inq[i]);
2751 len +=
sprintf(page+len,
" Rev: ");
2753 for( i = 32; i < 36; i++ ) {
2754 len +=
sprintf(page+len,
"%c", scsi_inq[i]);
2757 len +=
sprintf(page+len,
"\n");
2759 i = scsi_inq[0] & 0x1f;
2764 " ANSI SCSI revision: %02x", scsi_inq[2] & 0x07);
2766 if( (scsi_inq[2] & 0x07) == 1 && (scsi_inq[3] & 0x0f) == 1 )
2767 len +=
sprintf(page+len,
" CCS\n");
2769 len +=
sprintf(page+len,
"\n");
2787 proc_rdrv_10(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2794 return (proc_rdrv(adapter, page, 0, 9));
2810 proc_rdrv_20(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2817 return (proc_rdrv(adapter, page, 10, 19));
2833 proc_rdrv_30(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2840 return (proc_rdrv(adapter, page, 20, 29));
2856 proc_rdrv_40(
char *page,
char **start,
off_t offset,
int count,
int *eof,
2863 return (proc_rdrv(adapter, page, 30, 39));
2878 proc_rdrv(
adapter_t *adapter,
char *page,
int start,
int end )
2881 logdrv_param *lparam;
2893 if( make_local_pdev(adapter, &pdev) != 0 ) {
2897 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) ==
NULL ) {
2898 free_local_pdev(pdev);
2902 if( mega_adapinq(adapter, dma_handle) != 0 ) {
2904 len =
sprintf(page,
"Adapter inquiry failed.\n");
2908 mega_free_inquiry(inquiry, dma_handle, pdev);
2910 free_local_pdev(pdev);
2915 memset(&mc, 0,
sizeof(megacmd_t));
2918 array_sz =
sizeof(disk_array_40ld);
2920 rdrv_state = ((mega_inquiry3 *)inquiry)->ldrv_state;
2922 num_ldrv = ((mega_inquiry3 *)inquiry)->num_ldrv;
2925 array_sz =
sizeof(disk_array_8ld);
2927 rdrv_state = ((mraid_ext_inquiry *)inquiry)->
2928 raid_inq.logdrv_info.ldrv_state;
2930 num_ldrv = ((mraid_ext_inquiry *)inquiry)->
2931 raid_inq.logdrv_info.num_ldrv;
2935 &disk_array_dma_handle);
2937 if( disk_array ==
NULL ) {
2938 len =
sprintf(page,
"memory not available.\n");
2940 mega_free_inquiry(inquiry, dma_handle, pdev);
2942 free_local_pdev(pdev);
2947 mc.xferaddr = (
u32)disk_array_dma_handle;
2953 if( mega_internal_command(adapter, &mc,
NULL) ) {
2955 len =
sprintf(page,
"40LD read config failed.\n");
2957 mega_free_inquiry(inquiry, dma_handle, pdev);
2960 disk_array_dma_handle);
2962 free_local_pdev(pdev);
2971 if( mega_internal_command(adapter, &mc,
NULL) ) {
2975 if( mega_internal_command(adapter, &mc,
2979 "8LD read config failed.\n");
2981 mega_free_inquiry(inquiry, dma_handle, pdev);
2985 disk_array_dma_handle);
2987 free_local_pdev(pdev);
2994 for( i = start; i < ( (end+1 <
num_ldrv) ? end+1 : num_ldrv ); i++ ) {
2998 &((disk_array_40ld *)disk_array)->ldrv[
i].lparam;
3002 &((disk_array_8ld *)disk_array)->ldrv[
i].lparam;
3011 len +=
sprintf(page+len,
"Logical drive:%2d:, ", i);
3013 switch( rdrv_state[i] & 0x0F ) {
3015 len +=
sprintf(page+len,
"state: offline");
3019 len +=
sprintf(page+len,
"state: degraded");
3023 len +=
sprintf(page+len,
"state: optimal");
3027 len +=
sprintf(page+len,
"state: deleted");
3031 len +=
sprintf(page+len,
"state: unknown");
3039 if( (rdrv_state[i] & 0xF0) == 0x20 ) {
3041 ", check-consistency in progress");
3043 else if( (rdrv_state[i] & 0xF0) == 0x10 ) {
3045 ", initialization in progress");
3048 len +=
sprintf(page+len,
"\n");
3050 len +=
sprintf(page+len,
"Span depth:%3d, ",
3051 lparam->span_depth);
3053 len +=
sprintf(page+len,
"RAID level:%3d, ",
3056 len +=
sprintf(page+len,
"Stripe size:%3d, ",
3057 lparam->stripe_sz ? lparam->stripe_sz/2: 128);
3059 len +=
sprintf(page+len,
"Row size:%3d\n",
3063 len +=
sprintf(page+len,
"Read Policy: ");
3065 switch(lparam->read_ahead) {
3068 len +=
sprintf(page+len,
"No read ahead, ");
3072 len +=
sprintf(page+len,
"Read ahead, ");
3076 len +=
sprintf(page+len,
"Adaptive, ");
3081 len +=
sprintf(page+len,
"Write Policy: ");
3083 switch(lparam->write_mode) {
3086 len +=
sprintf(page+len,
"Write thru, ");
3090 len +=
sprintf(page+len,
"Write back, ");
3094 len +=
sprintf(page+len,
"Cache Policy: ");
3096 switch(lparam->direct_io) {
3099 len +=
sprintf(page+len,
"Cached IO\n\n");
3103 len +=
sprintf(page+len,
"Direct IO\n\n");
3108 mega_free_inquiry(inquiry, dma_handle, pdev);
3111 disk_array_dma_handle);
3113 free_local_pdev(pdev);
3118 static inline void mega_create_proc_entry(
int index,
struct proc_dir_entry *parent)
3147 cylinders = (
ulong)capacity / (heads * sectors);
3153 if ((
ulong)capacity >= 0x200000) {
3156 cylinders = (
ulong)capacity / (heads * sectors);
3169 &geom[2], &geom[0], &geom[1]);
3176 "megaraid: invalid partition on this disk on channel %d\n",
3182 cylinders = (
ulong)capacity / (heads * sectors);
3185 if ((
ulong)capacity >= 0x200000) {
3188 cylinders = (
ulong)capacity / (heads * sectors);
3214 for( i = 0; i < adapter->
max_cmds; i++ ) {
3224 for( i = 0; i < adapter->
max_cmds; i++ ) {
3231 sizeof(mega_sgl64) * adapter->
sglen,
3234 scb->
sgl = (mega_sglist *)scb->
sgl64;
3238 mega_free_sgl(adapter);
3243 sizeof(mega_passthru),
3248 mega_free_sgl(adapter);
3253 sizeof(mega_ext_passthru),
3258 "Can't allocate extended passthru.\n");
3259 mega_free_sgl(adapter);
3313 megadev_ioctl(
struct file *filep,
unsigned int cmd,
unsigned long arg)
3319 mega_passthru
__user *upthru;
3320 mega_passthru *
pthru;
3350 if( (rval = mega_m_to_n( (
void __user *)arg, &uioc)) != 0 )
3363 if(
put_user(hba_count, (
u32 __user *)uioc.uioc_uaddr) )
3395 adapter = hba_soft_state[
adapno];
3397 ustats = uioc.uioc_uaddr;
3408 num_ldrv*
sizeof(
u32)) )
3411 if(
copy_to_user(ustats->nreadblocks, adapter->nreadblocks,
3412 num_ldrv*
sizeof(
u32)) )
3416 num_ldrv*
sizeof(
u32)) )
3419 if(
copy_to_user(ustats->nwriteblocks, adapter->nwriteblocks,
3420 num_ldrv*
sizeof(
u32)) )
3423 if(
copy_to_user(ustats->rd_errors, adapter->rd_errors,
3424 num_ldrv*
sizeof(
u32)) )
3427 if(
copy_to_user(ustats->wr_errors, adapter->wr_errors,
3428 num_ldrv*
sizeof(
u32)) )
3442 adapter = hba_soft_state[
adapno];
3456 printk(
"delete on non-supporting F/W.\n");
3461 rval = mega_del_logdrv( adapter, uioc.uioc_rmbox[3] );
3464 memset(&mc, 0,
sizeof(megacmd_t));
3468 rval = mega_n_to_m((
void __user *)arg, &mc);
3489 if( make_local_pdev(adapter, &pdev) != 0 )
3497 sizeof(mega_passthru),
3500 if( pthru ==
NULL ) {
3501 free_local_pdev(pdev);
3508 upthru = (mega_passthru
__user *)(
unsigned long)
MBOX(uioc)->xferaddr;
3514 sizeof(mega_passthru)) ) {
3517 sizeof(mega_passthru), pthru,
3520 free_local_pdev(pdev);
3528 if( pthru->dataxferlen ) {
3533 if( data ==
NULL ) {
3535 sizeof(mega_passthru),
3539 free_local_pdev(pdev);
3548 uxferaddr = pthru->dataxferaddr;
3549 pthru->dataxferaddr = data_dma_hndl;
3560 if(
copy_from_user(data, (
char __user *)(
unsigned long) uxferaddr,
3561 pthru->dataxferlen) ) {
3563 goto freemem_and_return;
3567 memset(&mc, 0,
sizeof(megacmd_t));
3570 mc.xferaddr = (
u32)pthru_dma_hndl;
3575 mega_internal_command(adapter, &mc, pthru);
3577 rval = mega_n_to_m((
void __user *)arg, &mc);
3579 if( rval )
goto freemem_and_return;
3586 if(
copy_to_user((
char __user *)(
unsigned long) uxferaddr, data,
3587 pthru->dataxferlen) ) {
3597 pthru->reqsensearea, 14))
3601 if( pthru->dataxferlen ) {
3603 pthru->dataxferlen, data,
3608 pthru, pthru_dma_hndl);
3610 free_local_pdev(pdev);
3622 uioc.
xferlen, &data_dma_hndl);
3624 if( data ==
NULL ) {
3625 free_local_pdev(pdev);
3629 uxferaddr =
MBOX(uioc)->xferaddr;
3639 if(
copy_from_user(data, (
char __user *)(
unsigned long) uxferaddr,
3644 data, data_dma_hndl);
3646 free_local_pdev(pdev);
3654 mc.xferaddr = (
u32)data_dma_hndl;
3659 mega_internal_command(adapter, &mc,
NULL);
3661 rval = mega_n_to_m((
void __user *)arg, &mc);
3670 free_local_pdev(pdev);
3679 if(
copy_to_user((
char __user *)(
unsigned long) uxferaddr, data,
3692 free_local_pdev(pdev);
3705 megadev_unlocked_ioctl(
struct file *filep,
unsigned int cmd,
unsigned long arg)
3710 ret = megadev_ioctl(filep, cmd, arg);
3727 mega_m_to_n(
void __user *arg,
nitioctl_t *uioc)
3745 if(
memcmp(signature,
"MEGANIT", 7) == 0 ) {
3773 opcode = uioc_mimd.ui.fcs.opcode;
3774 subopcode = uioc_mimd.ui.fcs.subopcode;
3779 switch (subopcode) {
3783 uioc->uioc_uaddr = uioc_mimd.data;
3788 uioc->uioc_uaddr = uioc_mimd.data;
3793 uioc->
adapno = uioc_mimd.ui.fcs.adapno;
3794 uioc->uioc_uaddr = uioc_mimd.data;
3807 uioc->
adapno = uioc_mimd.ui.fcs.adapno;
3809 memcpy(uioc->uioc_rmbox, uioc_mimd.mbox, 18);
3811 uioc->
xferlen = uioc_mimd.ui.fcs.length;
3821 uioc->
adapno = uioc_mimd.ui.fcs.adapno;
3823 memcpy(uioc->uioc_rmbox, uioc_mimd.mbox, 18);
3828 uioc->
xferlen = uioc_mimd.outlen > uioc_mimd.inlen ?
3829 uioc_mimd.outlen : uioc_mimd.inlen;
3853 mega_n_to_m(
void __user *arg, megacmd_t *mc)
3857 mega_passthru
__user *upthru;
3859 char signature[8] = {0};
3867 if(
memcmp(signature,
"MEGANIT", 7) == 0 ) {
3878 if (
get_user(upthru, (mega_passthru __user * __user *)&umc->xferaddr))
3881 if(
put_user(mc->status, (
u8 __user *)&upthru->scsistatus))
3895 if (
get_user(upthru, (mega_passthru __user * __user *)&umc->xferaddr))
3898 if(
put_user(mc->status, (
u8 __user *)&upthru->scsistatus) )
3918 mega_is_bios_enabled(
adapter_t *adapter)
3920 unsigned char raw_mbox[
sizeof(
struct mbox_out)];
3924 mbox = (mbox_t *)raw_mbox;
3926 memset(&mbox->m_out, 0,
sizeof(raw_mbox));
3936 ret = issue_scb_block(adapter, raw_mbox);
3953 unsigned char raw_mbox[
sizeof(
struct mbox_out)];
3957 mbox = (mbox_t *)raw_mbox;
3959 memset(&mbox->m_out, 0,
sizeof(raw_mbox));
3977 if(!issue_scb_block(adapter, raw_mbox)) {
3982 for( i = 0; i < adapter->
product_info.nchannels; i++ ) {
4008 unsigned char raw_mbox[
sizeof(
struct mbox_out)];
4015 mbox = (mbox_t *)raw_mbox;
4017 memset(&mbox->m_out, 0,
sizeof(raw_mbox));
4033 if(issue_scb_block(adapter, raw_mbox) == 0) {
4038 cksum_p = (
char *)prv_bios_data;
4039 for (i = 0; i < 14; i++ ) {
4040 cksum += (
u16)(*cksum_p++);
4049 if( prv_bios_data->
boot_drv & 0x80 ) {
4051 boot_pdrv = prv_bios_data->
boot_drv & 0x7F;
4072 mega_support_random_del(
adapter_t *adapter)
4074 unsigned char raw_mbox[
sizeof(
struct mbox_out)];
4078 mbox = (mbox_t *)raw_mbox;
4080 memset(&mbox->m_out, 0,
sizeof(raw_mbox));
4088 rval = issue_scb_block(adapter, raw_mbox);
4101 mega_support_ext_cdb(
adapter_t *adapter)
4103 unsigned char raw_mbox[
sizeof(
struct mbox_out)];
4107 mbox = (mbox_t *)raw_mbox;
4109 memset(&mbox->m_out, 0,
sizeof(raw_mbox));
4116 rval = issue_scb_block(adapter, raw_mbox);
4133 unsigned long flags;
4151 rval = mega_do_del_logdrv(adapter, logdrv);
4163 if (scb->
pthru->logdrv < 0x80 )
4164 scb->
pthru->logdrv += 0x80;
4170 mega_runpendq(adapter);
4172 spin_unlock_irqrestore(&adapter->
lock, flags);
4179 mega_do_del_logdrv(
adapter_t *adapter,
int logdrv)
4184 memset( &mc, 0,
sizeof(megacmd_t));
4190 rval = mega_internal_command(adapter, &mc,
NULL);
4218 unsigned char raw_mbox[
sizeof(
struct mbox_out)];
4221 mbox = (mbox_t *)raw_mbox;
4223 memset(mbox, 0,
sizeof(raw_mbox));
4233 if( issue_scb_block(adapter, raw_mbox) ) {
4261 mega_support_cluster(
adapter_t *adapter)
4263 unsigned char raw_mbox[
sizeof(
struct mbox_out)];
4266 mbox = (mbox_t *)raw_mbox;
4268 memset(mbox, 0,
sizeof(raw_mbox));
4280 if( issue_scb_block(adapter, raw_mbox) == 0 ) {
4295 #ifdef CONFIG_PROC_FS
4310 memset(&mc, 0,
sizeof(megacmd_t));
4321 mc.xferaddr = (
u32)dma_handle;
4323 if ( mega_internal_command(adapter, &mc,
NULL) != 0 ) {
4340 mega_internal_dev_inquiry(
adapter_t *adapter,
u8 ch,
u8 tgt,
4343 mega_passthru *
pthru;
4354 if( make_local_pdev(adapter, &pdev) != 0 )
return -1;
4359 if( pthru ==
NULL ) {
4360 free_local_pdev(pdev);
4366 pthru->reqsenselen = 14;
4367 pthru->islogical = 0;
4371 pthru->target = (adapter->
flag &
BOARD_40LD) ? (ch << 4)|tgt : tgt;
4379 pthru->cdb[4] = 255;
4383 pthru->dataxferaddr = (
u32)buf_dma_handle;
4384 pthru->dataxferlen = 256;
4386 memset(&mc, 0,
sizeof(megacmd_t));
4389 mc.xferaddr = (
u32)pthru_dma_handle;
4391 rval = mega_internal_command(adapter, &mc, pthru);
4396 free_local_pdev(pdev);
4418 mega_internal_command(
adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru)
4463 megaraid_queue_lck(scmd, mega_internal_done);
4468 mc->status = scmd->
result;
4475 if( scmd->
result && trace_level ) {
4476 printk(
"megaraid: cmd [%x, %x, %x] status:[%x]\n",
4477 mc->cmd, mc->opcode, mc->subopcode, scmd->
result);
4509 .proc_name =
"megaraid_legacy",
4511 .queuecommand = megaraid_queue,
4512 .bios_param = megaraid_biosparam,
4519 .eh_abort_handler = megaraid_abort,
4520 .eh_device_reset_handler = megaraid_reset,
4521 .eh_bus_reset_handler = megaraid_reset,
4522 .eh_host_reset_handler = megaraid_reset,
4530 unsigned long mega_baseport,
tbase,
flag = 0;
4531 u16 subsysid, subsysvid;
4540 pci_bus = pdev->
bus->number;
4541 pci_dev_func = pdev->
devfn;
4583 printk(
"slot %d:func %d\n",
4590 tbase = mega_baseport;
4596 goto out_disable_device;
4599 mega_baseport = (
unsigned long)
ioremap(mega_baseport, 128);
4600 if (!mega_baseport) {
4602 "megaraid: could not map hba memory\n");
4603 goto out_release_region;
4607 mega_baseport += 0x10;
4610 goto out_disable_device;
4622 "scsi%d:Found MegaRAID controller at 0x%lx, IRQ:%d\n",
4623 host->
host_no, mega_baseport, irq);
4625 adapter->
base = mega_baseport;
4639 adapter->
dev = pdev;
4640 adapter->
host = host;
4644 if (flag & BOARD_MEMMAP)
4648 adapter->
host->n_io_port = 16;
4651 adapter->
host->unique_id = (pci_bus << 8) | pci_dev_func;
4666 goto out_free_cmd_buffer;
4670 megaraid_isr_memmapped : megaraid_isr_iomapped,
4673 "megaraid: Couldn't register IRQ %d!\n", irq);
4674 goto out_free_scb_list;
4677 if (mega_setup_mailbox(adapter))
4680 if (mega_query_adapter(adapter))
4686 if ((subsysid == 0x1111) && (subsysvid == 0x1111)) {
4694 "megaraid: Your card is a Dell PERC "
4695 "2/SC RAID controller with "
4696 "firmware\nmegaraid: 3.00 or 3.01. "
4697 "This driver is known to have "
4698 "corruption issues\nmegaraid: with "
4699 "those firmware versions on this "
4700 "specific card. In order\nmegaraid: "
4701 "to protect your data, please upgrade "
4702 "your firmware to version\nmegaraid: "
4703 "3.10 or later, available from the "
4704 "Dell Technical Support web\n"
4705 "megaraid: site at\nhttp://support."
4706 "dell.com/us/en/filelib/download/"
4707 "index.asp?fileid=2940\n"
4719 ((subsysid == 0x60E7) || (subsysid == 0x60E8))) {
4727 "megaraid: Firmware H.01.07, "
4728 "H.01.08, and H.01.09 on 1M/2M "
4730 "megaraid: do not support 64 bit "
4731 "addressing.\nmegaraid: DISABLING "
4732 "64 bit support.\n");
4737 if (mega_is_bios_enabled(adapter))
4745 mega_enum_raid_scsi(adapter);
4755 mega_get_boot_drv(adapter);
4759 for( i = 0; i <
j; i++ )
4780 if (mega_init_scb(adapter))
4793 hba_soft_state[hba_count] =
adapter;
4829 #if MEGA_HAVE_CLUSTERING
4837 adapter->
has_cluster = mega_support_cluster(adapter);
4840 "megaraid: Cluster driver, initiator id:%d\n",
4845 pci_set_drvdata(pdev, host);
4847 mega_create_proc_entry(hba_count, mega_proc_dir_entry);
4849 error = scsi_add_host(host, &pdev->
dev);
4864 out_free_cmd_buffer:
4870 if (flag & BOARD_MEMMAP)
4871 iounmap((
void *)mega_baseport);
4873 if (flag & BOARD_MEMMAP)
4887 mbox_t *mbox = (mbox_t *)raw_mbox;
4891 memset(&mbox->m_out, 0,
sizeof(raw_mbox));
4897 issue_scb_block(adapter, raw_mbox);
4900 memset(&mbox->m_out, 0,
sizeof(raw_mbox));
4904 issue_scb_block(adapter, raw_mbox);
4913 for (i = 0; i <= 10; i++)
4918 megaraid_remove_one(
struct pci_dev *pdev)
4920 struct Scsi_Host *host = pci_get_drvdata(pdev);
4925 __megaraid_shutdown(adapter);
4928 if (adapter->
flag & BOARD_MEMMAP) {
4934 mega_free_sgl(adapter);
4936 #ifdef CONFIG_PROC_FS
4937 if (adapter->controller_proc_dir_entry) {
4940 adapter->controller_proc_dir_entry);
4942 adapter->controller_proc_dir_entry);
4943 #if MEGA_HAVE_ENH_PROC
4945 adapter->controller_proc_dir_entry);
4947 adapter->controller_proc_dir_entry);
4950 adapter->controller_proc_dir_entry);
4952 adapter->controller_proc_dir_entry);
4954 adapter->controller_proc_dir_entry);
4956 adapter->controller_proc_dir_entry);
4959 adapter->controller_proc_dir_entry);
4961 adapter->controller_proc_dir_entry);
4963 adapter->controller_proc_dir_entry);
4965 adapter->controller_proc_dir_entry);
4968 char buf[12] = { 0 };
4988 megaraid_shutdown(
struct pci_dev *pdev)
4990 struct Scsi_Host *host = pci_get_drvdata(pdev);
4993 __megaraid_shutdown(adapter);
5007 static struct pci_driver megaraid_pci_driver = {
5008 .name =
"megaraid_legacy",
5009 .id_table = megaraid_pci_tbl,
5010 .probe = megaraid_probe_one,
5012 .shutdown = megaraid_shutdown,
5015 static int __init megaraid_init(
void)
5024 #ifdef CONFIG_PROC_FS
5026 if (!mega_proc_dir_entry) {
5028 "megaraid: failed to create megaraid root\n");
5031 error = pci_register_driver(&megaraid_pci_driver);
5033 #ifdef CONFIG_PROC_FS
5045 major = register_chrdev(0,
"megadev_legacy", &megadev_fops);
5048 "megaraid: failed to register char device\n");
5054 static void __exit megaraid_exit(
void)
5059 unregister_chrdev(major,
"megadev_legacy");
5063 #ifdef CONFIG_PROC_FS