Commit 01585964 authored by Mark Haverkamp's avatar Mark Haverkamp Committed by Christoph Hellwig

[PATCH] megaraid driver update

This is a patch for the megaraid driver that splits the mbox_t structure
into two sections.  The raw_mbox automatics are sized based on the
mbox_out part.  This saves quite a few bytes on the stack (for the
raw_mbox arrays) and limits the amount of bytes in the mbox_t structure
that are cleared.

In issue_scb_block, I changed setting the cmdid and busy elements from
being set in the raw_mbox to being set in the mbox itself after the
memcpy.
parent 533b1217
...@@ -723,7 +723,7 @@ mega_query_adapter(adapter_t *adapter) ...@@ -723,7 +723,7 @@ mega_query_adapter(adapter_t *adapter)
{ {
dma_addr_t prod_info_dma_handle; dma_addr_t prod_info_dma_handle;
mega_inquiry3 *inquiry3; mega_inquiry3 *inquiry3;
u8 raw_mbox[sizeof(mbox_t)]; u8 raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
int retval; int retval;
...@@ -732,14 +732,14 @@ mega_query_adapter(adapter_t *adapter) ...@@ -732,14 +732,14 @@ mega_query_adapter(adapter_t *adapter)
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
/* /*
* Try to issue Inquiry3 command * Try to issue Inquiry3 command
* if not succeeded, then issue MEGA_MBOXCMD_ADAPTERINQ command and * if not succeeded, then issue MEGA_MBOXCMD_ADAPTERINQ command and
* update enquiry3 structure * update enquiry3 structure
*/ */
mbox->xferaddr = (u32)adapter->buf_dma_handle; mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
inquiry3 = (mega_inquiry3 *)adapter->mega_buffer; inquiry3 = (mega_inquiry3 *)adapter->mega_buffer;
...@@ -762,10 +762,10 @@ mega_query_adapter(adapter_t *adapter) ...@@ -762,10 +762,10 @@ mega_query_adapter(adapter_t *adapter)
inq = &ext_inq->raid_inq; inq = &ext_inq->raid_inq;
mbox->xferaddr = (u32)dma_handle; mbox->m_out.xferaddr = (u32)dma_handle;
/*issue old 0x04 command to adapter */ /*issue old 0x04 command to adapter */
mbox->cmd = MEGA_MBOXCMD_ADPEXTINQ; mbox->m_out.cmd = MEGA_MBOXCMD_ADPEXTINQ;
issue_scb_block(adapter, raw_mbox); issue_scb_block(adapter, raw_mbox);
...@@ -790,7 +790,7 @@ mega_query_adapter(adapter_t *adapter) ...@@ -790,7 +790,7 @@ mega_query_adapter(adapter_t *adapter)
&adapter->product_info, &adapter->product_info,
sizeof(mega_product_info), PCI_DMA_FROMDEVICE); sizeof(mega_product_info), PCI_DMA_FROMDEVICE);
mbox->xferaddr = prod_info_dma_handle; mbox->m_out.xferaddr = prod_info_dma_handle;
raw_mbox[0] = FC_NEW_CONFIG; /* i.e. mbox->cmd=0xA1 */ raw_mbox[0] = FC_NEW_CONFIG; /* i.e. mbox->cmd=0xA1 */
raw_mbox[2] = NC_SUBOP_PRODUCT_INFO; /* i.e. 0x0E */ raw_mbox[2] = NC_SUBOP_PRODUCT_INFO; /* i.e. 0x0E */
...@@ -1141,10 +1141,10 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1141,10 +1141,10 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
memcpy(pthru->cdb, cmd->cmnd, cmd->cmd_len); memcpy(pthru->cdb, cmd->cmnd, cmd->cmd_len);
if( adapter->has_64bit_addr ) { if( adapter->has_64bit_addr ) {
mbox->cmd = MEGA_MBOXCMD_PASSTHRU64; mbox->m_out.cmd = MEGA_MBOXCMD_PASSTHRU64;
} }
else { else {
mbox->cmd = MEGA_MBOXCMD_PASSTHRU; mbox->m_out.cmd = MEGA_MBOXCMD_PASSTHRU;
} }
scb->dma_direction = PCI_DMA_FROMDEVICE; scb->dma_direction = PCI_DMA_FROMDEVICE;
...@@ -1152,7 +1152,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1152,7 +1152,7 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
pthru->numsgelements = mega_build_sglist(adapter, scb, pthru->numsgelements = mega_build_sglist(adapter, scb,
&pthru->dataxferaddr, &pthru->dataxferlen); &pthru->dataxferaddr, &pthru->dataxferlen);
mbox->xferaddr = scb->pthru_dma_addr; mbox->m_out.xferaddr = scb->pthru_dma_addr;
return scb; return scb;
...@@ -1175,19 +1175,19 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1175,19 +1175,19 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
mbox = (mbox_t *)scb->raw_mbox; mbox = (mbox_t *)scb->raw_mbox;
memset(mbox, 0, sizeof(scb->raw_mbox)); memset(mbox, 0, sizeof(scb->raw_mbox));
mbox->logdrv = ldrv_num; mbox->m_out.logdrv = ldrv_num;
/* /*
* A little hack: 2nd bit is zero for all scsi read * A little hack: 2nd bit is zero for all scsi read
* commands and is set for all scsi write commands * commands and is set for all scsi write commands
*/ */
if( adapter->has_64bit_addr ) { if( adapter->has_64bit_addr ) {
mbox->cmd = (*cmd->cmnd & 0x02) ? mbox->m_out.cmd = (*cmd->cmnd & 0x02) ?
MEGA_MBOXCMD_LWRITE64: MEGA_MBOXCMD_LWRITE64:
MEGA_MBOXCMD_LREAD64 ; MEGA_MBOXCMD_LREAD64 ;
} }
else { else {
mbox->cmd = (*cmd->cmnd & 0x02) ? mbox->m_out.cmd = (*cmd->cmnd & 0x02) ?
MEGA_MBOXCMD_LWRITE: MEGA_MBOXCMD_LWRITE:
MEGA_MBOXCMD_LREAD ; MEGA_MBOXCMD_LREAD ;
} }
...@@ -1196,13 +1196,13 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1196,13 +1196,13 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
* 6-byte READ(0x08) or WRITE(0x0A) cdb * 6-byte READ(0x08) or WRITE(0x0A) cdb
*/ */
if( cmd->cmd_len == 6 ) { if( cmd->cmd_len == 6 ) {
mbox->numsectors = (u32) cmd->cmnd[4]; mbox->m_out.numsectors = (u32) cmd->cmnd[4];
mbox->lba = mbox->m_out.lba =
((u32)cmd->cmnd[1] << 16) | ((u32)cmd->cmnd[1] << 16) |
((u32)cmd->cmnd[2] << 8) | ((u32)cmd->cmnd[2] << 8) |
(u32)cmd->cmnd[3]; (u32)cmd->cmnd[3];
mbox->lba &= 0x1FFFFF; mbox->m_out.lba &= 0x1FFFFF;
#if MEGA_HAVE_STATS #if MEGA_HAVE_STATS
/* /*
...@@ -1213,11 +1213,11 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1213,11 +1213,11 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
if (*cmd->cmnd == READ_6) { if (*cmd->cmnd == READ_6) {
adapter->nreads[ldrv_num%0x80]++; adapter->nreads[ldrv_num%0x80]++;
adapter->nreadblocks[ldrv_num%0x80] += adapter->nreadblocks[ldrv_num%0x80] +=
mbox->numsectors; mbox->m_out.numsectors;
} else { } else {
adapter->nwrites[ldrv_num%0x80]++; adapter->nwrites[ldrv_num%0x80]++;
adapter->nwriteblocks[ldrv_num%0x80] += adapter->nwriteblocks[ldrv_num%0x80] +=
mbox->numsectors; mbox->m_out.numsectors;
} }
#endif #endif
} }
...@@ -1226,10 +1226,10 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1226,10 +1226,10 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
* 10-byte READ(0x28) or WRITE(0x2A) cdb * 10-byte READ(0x28) or WRITE(0x2A) cdb
*/ */
if( cmd->cmd_len == 10 ) { if( cmd->cmd_len == 10 ) {
mbox->numsectors = mbox->m_out.numsectors =
(u32)cmd->cmnd[8] | (u32)cmd->cmnd[8] |
((u32)cmd->cmnd[7] << 8); ((u32)cmd->cmnd[7] << 8);
mbox->lba = mbox->m_out.lba =
((u32)cmd->cmnd[2] << 24) | ((u32)cmd->cmnd[2] << 24) |
((u32)cmd->cmnd[3] << 16) | ((u32)cmd->cmnd[3] << 16) |
((u32)cmd->cmnd[4] << 8) | ((u32)cmd->cmnd[4] << 8) |
...@@ -1239,11 +1239,11 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1239,11 +1239,11 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
if (*cmd->cmnd == READ_10) { if (*cmd->cmnd == READ_10) {
adapter->nreads[ldrv_num%0x80]++; adapter->nreads[ldrv_num%0x80]++;
adapter->nreadblocks[ldrv_num%0x80] += adapter->nreadblocks[ldrv_num%0x80] +=
mbox->numsectors; mbox->m_out.numsectors;
} else { } else {
adapter->nwrites[ldrv_num%0x80]++; adapter->nwrites[ldrv_num%0x80]++;
adapter->nwriteblocks[ldrv_num%0x80] += adapter->nwriteblocks[ldrv_num%0x80] +=
mbox->numsectors; mbox->m_out.numsectors;
} }
#endif #endif
} }
...@@ -1252,13 +1252,13 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1252,13 +1252,13 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
* 12-byte READ(0xA8) or WRITE(0xAA) cdb * 12-byte READ(0xA8) or WRITE(0xAA) cdb
*/ */
if( cmd->cmd_len == 12 ) { if( cmd->cmd_len == 12 ) {
mbox->lba = mbox->m_out.lba =
((u32)cmd->cmnd[2] << 24) | ((u32)cmd->cmnd[2] << 24) |
((u32)cmd->cmnd[3] << 16) | ((u32)cmd->cmnd[3] << 16) |
((u32)cmd->cmnd[4] << 8) | ((u32)cmd->cmnd[4] << 8) |
(u32)cmd->cmnd[5]; (u32)cmd->cmnd[5];
mbox->numsectors = mbox->m_out.numsectors =
((u32)cmd->cmnd[6] << 24) | ((u32)cmd->cmnd[6] << 24) |
((u32)cmd->cmnd[7] << 16) | ((u32)cmd->cmnd[7] << 16) |
((u32)cmd->cmnd[8] << 8) | ((u32)cmd->cmnd[8] << 8) |
...@@ -1268,11 +1268,11 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1268,11 +1268,11 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
if (*cmd->cmnd == READ_12) { if (*cmd->cmnd == READ_12) {
adapter->nreads[ldrv_num%0x80]++; adapter->nreads[ldrv_num%0x80]++;
adapter->nreadblocks[ldrv_num%0x80] += adapter->nreadblocks[ldrv_num%0x80] +=
mbox->numsectors; mbox->m_out.numsectors;
} else { } else {
adapter->nwrites[ldrv_num%0x80]++; adapter->nwrites[ldrv_num%0x80]++;
adapter->nwriteblocks[ldrv_num%0x80] += adapter->nwriteblocks[ldrv_num%0x80] +=
mbox->numsectors; mbox->m_out.numsectors;
} }
#endif #endif
} }
...@@ -1288,8 +1288,8 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1288,8 +1288,8 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
} }
/* Calculate Scatter-Gather info */ /* Calculate Scatter-Gather info */
mbox->numsgelements = mega_build_sglist(adapter, scb, mbox->m_out.numsgelements = mega_build_sglist(adapter, scb,
(u32 *)&mbox->xferaddr, (u32 *)&seg); (u32 *)&mbox->m_out.xferaddr, (u32 *)&seg);
return scb; return scb;
...@@ -1357,9 +1357,9 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1357,9 +1357,9 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
epthru = mega_prepare_extpassthru(adapter, scb, cmd, epthru = mega_prepare_extpassthru(adapter, scb, cmd,
channel, target); channel, target);
mbox->cmd = MEGA_MBOXCMD_EXTPTHRU; mbox->m_out.cmd = MEGA_MBOXCMD_EXTPTHRU;
mbox->xferaddr = scb->epthru_dma_addr; mbox->m_out.xferaddr = scb->epthru_dma_addr;
} }
else { else {
...@@ -1369,13 +1369,13 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy) ...@@ -1369,13 +1369,13 @@ mega_build_cmd(adapter_t *adapter, Scsi_Cmnd *cmd, int *busy)
/* Initialize mailbox */ /* Initialize mailbox */
if( adapter->has_64bit_addr ) { if( adapter->has_64bit_addr ) {
mbox->cmd = MEGA_MBOXCMD_PASSTHRU64; mbox->m_out.cmd = MEGA_MBOXCMD_PASSTHRU64;
} }
else { else {
mbox->cmd = MEGA_MBOXCMD_PASSTHRU; mbox->m_out.cmd = MEGA_MBOXCMD_PASSTHRU;
} }
mbox->xferaddr = scb->pthru_dma_addr; mbox->m_out.xferaddr = scb->pthru_dma_addr;
} }
return scb; return scb;
...@@ -1593,20 +1593,21 @@ issue_scb(adapter_t *adapter, scb_t *scb) ...@@ -1593,20 +1593,21 @@ issue_scb(adapter_t *adapter, scb_t *scb)
volatile mbox_t *mbox = adapter->mbox; volatile mbox_t *mbox = adapter->mbox;
unsigned int i = 0; unsigned int i = 0;
if(unlikely(mbox->busy)) { if(unlikely(mbox->m_in.busy)) {
do { do {
udelay(1); udelay(1);
i++; i++;
} while( mbox->busy && (i < max_mbox_busy_wait) ); } while( mbox->m_in.busy && (i < max_mbox_busy_wait) );
if(mbox->busy) return -1; if(mbox->m_in.busy) return -1;
} }
/* Copy mailbox data into host structure */ /* Copy mailbox data into host structure */
memcpy((char *)mbox, (char *)scb->raw_mbox, 16); memcpy((char *)&mbox->m_out, (char *)scb->raw_mbox,
sizeof(struct mbox_out));
mbox->cmdid = scb->idx; /* Set cmdid */ mbox->m_out.cmdid = scb->idx; /* Set cmdid */
mbox->busy = 1; /* Set busy */ mbox->m_in.busy = 1; /* Set busy */
/* /*
...@@ -1614,14 +1615,14 @@ issue_scb(adapter_t *adapter, scb_t *scb) ...@@ -1614,14 +1615,14 @@ issue_scb(adapter_t *adapter, scb_t *scb)
*/ */
atomic_inc(&adapter->pend_cmds); atomic_inc(&adapter->pend_cmds);
switch (mbox->cmd) { switch (mbox->m_out.cmd) {
case MEGA_MBOXCMD_LREAD64: case MEGA_MBOXCMD_LREAD64:
case MEGA_MBOXCMD_LWRITE64: case MEGA_MBOXCMD_LWRITE64:
case MEGA_MBOXCMD_PASSTHRU64: case MEGA_MBOXCMD_PASSTHRU64:
case MEGA_MBOXCMD_EXTPTHRU: case MEGA_MBOXCMD_EXTPTHRU:
mbox64->xfer_segment_lo = mbox->xferaddr; mbox64->xfer_segment_lo = mbox->m_out.xferaddr;
mbox64->xfer_segment_hi = 0; mbox64->xfer_segment_hi = 0;
mbox->xferaddr = 0xFFFFFFFF; mbox->m_out.xferaddr = 0xFFFFFFFF;
break; break;
default: default:
mbox64->xfer_segment_lo = 0; mbox64->xfer_segment_lo = 0;
...@@ -1634,8 +1635,8 @@ issue_scb(adapter_t *adapter, scb_t *scb) ...@@ -1634,8 +1635,8 @@ issue_scb(adapter_t *adapter, scb_t *scb)
scb->state |= SCB_ISSUED; scb->state |= SCB_ISSUED;
if( likely(adapter->flag & BOARD_MEMMAP) ) { if( likely(adapter->flag & BOARD_MEMMAP) ) {
mbox->poll = 0; mbox->m_in.poll = 0;
mbox->ack = 0; mbox->m_in.ack = 0;
WRINDOOR(adapter, adapter->mbox_dma | 0x1); WRINDOOR(adapter, adapter->mbox_dma | 0x1);
} }
else { else {
...@@ -1661,24 +1662,23 @@ issue_scb_block(adapter_t *adapter, u_char *raw_mbox) ...@@ -1661,24 +1662,23 @@ issue_scb_block(adapter_t *adapter, u_char *raw_mbox)
volatile mbox_t *mbox = adapter->mbox; volatile mbox_t *mbox = adapter->mbox;
u8 byte; u8 byte;
raw_mbox[0x1] = 0xFE; /* Set cmdid */
raw_mbox[0xF] = 1; /* Set busy */
/* Wait until mailbox is free */ /* Wait until mailbox is free */
if(mega_busywait_mbox (adapter)) if(mega_busywait_mbox (adapter))
goto bug_blocked_mailbox; goto bug_blocked_mailbox;
/* Copy mailbox data into host structure */ /* Copy mailbox data into host structure */
memcpy((char *) mbox, raw_mbox, 16); memcpy((char *) mbox, raw_mbox, sizeof(struct mbox_out));
mbox->m_out.cmdid = 0xFE;
mbox->m_in.busy = 1;
switch (raw_mbox[0]) { switch (raw_mbox[0]) {
case MEGA_MBOXCMD_LREAD64: case MEGA_MBOXCMD_LREAD64:
case MEGA_MBOXCMD_LWRITE64: case MEGA_MBOXCMD_LWRITE64:
case MEGA_MBOXCMD_PASSTHRU64: case MEGA_MBOXCMD_PASSTHRU64:
case MEGA_MBOXCMD_EXTPTHRU: case MEGA_MBOXCMD_EXTPTHRU:
mbox64->xfer_segment_lo = mbox->xferaddr; mbox64->xfer_segment_lo = mbox->m_out.xferaddr;
mbox64->xfer_segment_hi = 0; mbox64->xfer_segment_hi = 0;
mbox->xferaddr = 0xFFFFFFFF; mbox->m_out.xferaddr = 0xFFFFFFFF;
break; break;
default: default:
mbox64->xfer_segment_lo = 0; mbox64->xfer_segment_lo = 0;
...@@ -1686,22 +1686,22 @@ issue_scb_block(adapter_t *adapter, u_char *raw_mbox) ...@@ -1686,22 +1686,22 @@ issue_scb_block(adapter_t *adapter, u_char *raw_mbox)
} }
if( likely(adapter->flag & BOARD_MEMMAP) ) { if( likely(adapter->flag & BOARD_MEMMAP) ) {
mbox->poll = 0; mbox->m_in.poll = 0;
mbox->ack = 0; mbox->m_in.ack = 0;
mbox->numstatus = 0xFF; mbox->m_in.numstatus = 0xFF;
mbox->status = 0xFF; mbox->m_in.status = 0xFF;
WRINDOOR(adapter, adapter->mbox_dma | 0x1); WRINDOOR(adapter, adapter->mbox_dma | 0x1);
while((volatile u8)mbox->numstatus == 0xFF) while((volatile u8)mbox->m_in.numstatus == 0xFF)
cpu_relax(); cpu_relax();
mbox->numstatus = 0xFF; mbox->m_in.numstatus = 0xFF;
while( (volatile u8)mbox->poll != 0x77 ) while( (volatile u8)mbox->m_in.poll != 0x77 )
cpu_relax(); cpu_relax();
mbox->poll = 0; mbox->m_in.poll = 0;
mbox->ack = 0x77; mbox->m_in.ack = 0x77;
WRINDOOR(adapter, adapter->mbox_dma | 0x2); WRINDOOR(adapter, adapter->mbox_dma | 0x2);
...@@ -1720,7 +1720,7 @@ issue_scb_block(adapter_t *adapter, u_char *raw_mbox) ...@@ -1720,7 +1720,7 @@ issue_scb_block(adapter_t *adapter, u_char *raw_mbox)
irq_ack(adapter); irq_ack(adapter);
} }
return mbox->status; return mbox->m_in.status;
bug_blocked_mailbox: bug_blocked_mailbox:
printk(KERN_WARNING "megaraid: Blocked mailbox......!!\n"); printk(KERN_WARNING "megaraid: Blocked mailbox......!!\n");
...@@ -1767,19 +1767,20 @@ megaraid_isr_iomapped(int irq, void *devp, struct pt_regs *regs) ...@@ -1767,19 +1767,20 @@ megaraid_isr_iomapped(int irq, void *devp, struct pt_regs *regs)
} }
set_irq_state(adapter, byte); set_irq_state(adapter, byte);
while((nstatus = (volatile u8)adapter->mbox->numstatus) while((nstatus = (volatile u8)adapter->mbox->m_in.numstatus)
== 0xFF) == 0xFF)
cpu_relax(); cpu_relax();
adapter->mbox->numstatus = 0xFF; adapter->mbox->m_in.numstatus = 0xFF;
status = adapter->mbox->status; status = adapter->mbox->m_in.status;
/* /*
* decrement the pending queue counter * decrement the pending queue counter
*/ */
atomic_sub(nstatus, &adapter->pend_cmds); atomic_sub(nstatus, &adapter->pend_cmds);
memcpy(completed, (void *)adapter->mbox->completed, nstatus); memcpy(completed, (void *)adapter->mbox->m_in.completed,
nstatus);
/* Acknowledge interrupt */ /* Acknowledge interrupt */
irq_ack(adapter); irq_ack(adapter);
...@@ -1843,20 +1844,21 @@ megaraid_isr_memmapped(int irq, void *devp, struct pt_regs *regs) ...@@ -1843,20 +1844,21 @@ megaraid_isr_memmapped(int irq, void *devp, struct pt_regs *regs)
} }
WROUTDOOR(adapter, 0x10001234); WROUTDOOR(adapter, 0x10001234);
while((nstatus = (volatile u8)adapter->mbox->numstatus) while((nstatus = (volatile u8)adapter->mbox->m_in.numstatus)
== 0xFF) { == 0xFF) {
cpu_relax(); cpu_relax();
} }
adapter->mbox->numstatus = 0xFF; adapter->mbox->m_in.numstatus = 0xFF;
status = adapter->mbox->status; status = adapter->mbox->m_in.status;
/* /*
* decrement the pending queue counter * decrement the pending queue counter
*/ */
atomic_sub(nstatus, &adapter->pend_cmds); atomic_sub(nstatus, &adapter->pend_cmds);
memcpy(completed, (void *)adapter->mbox->completed, nstatus); memcpy(completed, (void *)adapter->mbox->m_in.completed,
nstatus);
/* Acknowledge interrupt */ /* Acknowledge interrupt */
WRINDOOR(adapter, 0x2); WRINDOOR(adapter, 0x2);
...@@ -1986,7 +1988,7 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status) ...@@ -1986,7 +1988,7 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
#if MEGA_HAVE_STATS #if MEGA_HAVE_STATS
{ {
int logdrv = mbox->logdrv; int logdrv = mbox->m_out.logdrv;
islogical = adapter->logdrv_chan[cmd->channel]; islogical = adapter->logdrv_chan[cmd->channel];
/* /*
...@@ -2065,8 +2067,8 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status) ...@@ -2065,8 +2067,8 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
SCSI_STATUS_CHECK_CONDITION */ SCSI_STATUS_CHECK_CONDITION */
/* set sense_buffer and result fields */ /* set sense_buffer and result fields */
if( mbox->cmd == MEGA_MBOXCMD_PASSTHRU || if( mbox->m_out.cmd == MEGA_MBOXCMD_PASSTHRU ||
mbox->cmd == MEGA_MBOXCMD_PASSTHRU64 ) { mbox->m_out.cmd == MEGA_MBOXCMD_PASSTHRU64 ) {
memcpy(cmd->sense_buffer, pthru->reqsensearea, memcpy(cmd->sense_buffer, pthru->reqsensearea,
14); 14);
...@@ -2076,7 +2078,7 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status) ...@@ -2076,7 +2078,7 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
(CHECK_CONDITION << 1); (CHECK_CONDITION << 1);
} }
else { else {
if (mbox->cmd == MEGA_MBOXCMD_EXTPTHRU) { if (mbox->m_out.cmd == MEGA_MBOXCMD_EXTPTHRU) {
memcpy(cmd->sense_buffer, memcpy(cmd->sense_buffer,
epthru->reqsensearea, 14); epthru->reqsensearea, 14);
...@@ -2233,7 +2235,7 @@ mega_free_scb(adapter_t *adapter, scb_t *scb) ...@@ -2233,7 +2235,7 @@ mega_free_scb(adapter_t *adapter, scb_t *scb)
static inline int static inline int
mega_busywait_mbox (adapter_t *adapter) mega_busywait_mbox (adapter_t *adapter)
{ {
if (adapter->mbox->busy) if (adapter->mbox->m_in.busy)
return __mega_busywait_mbox(adapter); return __mega_busywait_mbox(adapter);
return 0; return 0;
} }
...@@ -2245,7 +2247,7 @@ __mega_busywait_mbox (adapter_t *adapter) ...@@ -2245,7 +2247,7 @@ __mega_busywait_mbox (adapter_t *adapter)
long counter; long counter;
for (counter = 0; counter < 10000; counter++) { for (counter = 0; counter < 10000; counter++) {
if (!mbox->busy) if (!mbox->m_in.busy)
return 0; return 0;
udelay(100); yield(); udelay(100); yield();
} }
...@@ -2400,7 +2402,7 @@ megaraid_release(struct Scsi_Host *host) ...@@ -2400,7 +2402,7 @@ megaraid_release(struct Scsi_Host *host)
{ {
adapter_t *adapter; adapter_t *adapter;
mbox_t *mbox; mbox_t *mbox;
u_char raw_mbox[sizeof(mbox_t)]; u_char raw_mbox[sizeof(struct mbox_out)];
char buf[12] = { 0 }; char buf[12] = { 0 };
adapter = (adapter_t *)host->hostdata; adapter = (adapter_t *)host->hostdata;
...@@ -2409,7 +2411,7 @@ megaraid_release(struct Scsi_Host *host) ...@@ -2409,7 +2411,7 @@ megaraid_release(struct Scsi_Host *host)
printk(KERN_NOTICE "megaraid: being unloaded..."); printk(KERN_NOTICE "megaraid: being unloaded...");
/* Flush adapter cache */ /* Flush adapter cache */
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
raw_mbox[0] = FLUSH_ADAPTER; raw_mbox[0] = FLUSH_ADAPTER;
irq_disable(adapter); irq_disable(adapter);
...@@ -2419,7 +2421,7 @@ megaraid_release(struct Scsi_Host *host) ...@@ -2419,7 +2421,7 @@ megaraid_release(struct Scsi_Host *host)
issue_scb_block(adapter, raw_mbox); issue_scb_block(adapter, raw_mbox);
/* Flush disks cache */ /* Flush disks cache */
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
raw_mbox[0] = FLUSH_SYSTEM; raw_mbox[0] = FLUSH_SYSTEM;
/* Issue a blocking (interrupts disabled) command to the card */ /* Issue a blocking (interrupts disabled) command to the card */
...@@ -2950,16 +2952,24 @@ proc_read_mbox(char *page, char **start, off_t offset, int count, int *eof, ...@@ -2950,16 +2952,24 @@ proc_read_mbox(char *page, char **start, off_t offset, int count, int *eof,
int len = 0; int len = 0;
len = sprintf(page, "Contents of Mail Box Structure\n"); len = sprintf(page, "Contents of Mail Box Structure\n");
len += sprintf(page+len, " Fw Command = 0x%02x\n", mbox->cmd); len += sprintf(page+len, " Fw Command = 0x%02x\n",
len += sprintf(page+len, " Cmd Sequence = 0x%02x\n", mbox->cmdid); mbox->m_out.cmd);
len += sprintf(page+len, " No of Sectors= %04d\n", mbox->numsectors); len += sprintf(page+len, " Cmd Sequence = 0x%02x\n",
len += sprintf(page+len, " LBA = 0x%02x\n", mbox->lba); mbox->m_out.cmdid);
len += sprintf(page+len, " DTA = 0x%08x\n", mbox->xferaddr); len += sprintf(page+len, " No of Sectors= %04d\n",
len += sprintf(page+len, " Logical Drive= 0x%02x\n", mbox->logdrv); mbox->m_out.numsectors);
len += sprintf(page+len, " LBA = 0x%02x\n",
mbox->m_out.lba);
len += sprintf(page+len, " DTA = 0x%08x\n",
mbox->m_out.xferaddr);
len += sprintf(page+len, " Logical Drive= 0x%02x\n",
mbox->m_out.logdrv);
len += sprintf(page+len, " No of SG Elmt= 0x%02x\n", len += sprintf(page+len, " No of SG Elmt= 0x%02x\n",
mbox->numsgelements); mbox->m_out.numsgelements);
len += sprintf(page+len, " Busy = %01x\n", mbox->busy); len += sprintf(page+len, " Busy = %01x\n",
len += sprintf(page+len, " Status = 0x%02x\n", mbox->status); mbox->m_in.busy);
len += sprintf(page+len, " Status = 0x%02x\n",
mbox->m_in.status);
*eof = 1; *eof = 1;
...@@ -3852,7 +3862,7 @@ megaraid_reboot_notify (struct notifier_block *this, unsigned long code, ...@@ -3852,7 +3862,7 @@ megaraid_reboot_notify (struct notifier_block *this, unsigned long code,
{ {
adapter_t *adapter; adapter_t *adapter;
struct Scsi_Host *host; struct Scsi_Host *host;
u8 raw_mbox[sizeof(mbox_t)]; u8 raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
int i,j; int i,j;
...@@ -3868,7 +3878,7 @@ megaraid_reboot_notify (struct notifier_block *this, unsigned long code, ...@@ -3868,7 +3878,7 @@ megaraid_reboot_notify (struct notifier_block *this, unsigned long code,
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
/* Flush adapter cache */ /* Flush adapter cache */
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
raw_mbox[0] = FLUSH_ADAPTER; raw_mbox[0] = FLUSH_ADAPTER;
irq_disable(adapter); irq_disable(adapter);
...@@ -3881,7 +3891,7 @@ megaraid_reboot_notify (struct notifier_block *this, unsigned long code, ...@@ -3881,7 +3891,7 @@ megaraid_reboot_notify (struct notifier_block *this, unsigned long code,
issue_scb_block(adapter, raw_mbox); issue_scb_block(adapter, raw_mbox);
/* Flush disks cache */ /* Flush disks cache */
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
raw_mbox[0] = FLUSH_SYSTEM; raw_mbox[0] = FLUSH_SYSTEM;
issue_scb_block(adapter, raw_mbox); issue_scb_block(adapter, raw_mbox);
...@@ -4614,17 +4624,17 @@ mega_n_to_m(void *arg, megacmd_t *mc) ...@@ -4614,17 +4624,17 @@ mega_n_to_m(void *arg, megacmd_t *mc)
static int static int
mega_is_bios_enabled(adapter_t *adapter) mega_is_bios_enabled(adapter_t *adapter)
{ {
unsigned char raw_mbox[sizeof(mbox_t)]; unsigned char raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
int ret; int ret;
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
mbox->xferaddr = (u32)adapter->buf_dma_handle; mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
raw_mbox[0] = IS_BIOS_ENABLED; raw_mbox[0] = IS_BIOS_ENABLED;
raw_mbox[2] = GET_BIOS; raw_mbox[2] = GET_BIOS;
...@@ -4647,13 +4657,13 @@ mega_is_bios_enabled(adapter_t *adapter) ...@@ -4647,13 +4657,13 @@ mega_is_bios_enabled(adapter_t *adapter)
static void static void
mega_enum_raid_scsi(adapter_t *adapter) mega_enum_raid_scsi(adapter_t *adapter)
{ {
unsigned char raw_mbox[sizeof(mbox_t)]; unsigned char raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
int i; int i;
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
/* /*
* issue command to find out what channels are raid/scsi * issue command to find out what channels are raid/scsi
...@@ -4663,7 +4673,7 @@ mega_enum_raid_scsi(adapter_t *adapter) ...@@ -4663,7 +4673,7 @@ mega_enum_raid_scsi(adapter_t *adapter)
memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
mbox->xferaddr = (u32)adapter->buf_dma_handle; mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
/* /*
* Non-ROMB firware fail this command, so all channels * Non-ROMB firware fail this command, so all channels
...@@ -4702,7 +4712,7 @@ static void ...@@ -4702,7 +4712,7 @@ static void
mega_get_boot_drv(adapter_t *adapter) mega_get_boot_drv(adapter_t *adapter)
{ {
struct private_bios_data *prv_bios_data; struct private_bios_data *prv_bios_data;
unsigned char raw_mbox[sizeof(mbox_t)]; unsigned char raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
u16 cksum = 0; u16 cksum = 0;
u8 *cksum_p; u8 *cksum_p;
...@@ -4711,14 +4721,14 @@ mega_get_boot_drv(adapter_t *adapter) ...@@ -4711,14 +4721,14 @@ mega_get_boot_drv(adapter_t *adapter)
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
memset(mbox, 0, sizeof(raw_mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
raw_mbox[0] = BIOS_PVT_DATA; raw_mbox[0] = BIOS_PVT_DATA;
raw_mbox[2] = GET_BIOS_PVT_DATA; raw_mbox[2] = GET_BIOS_PVT_DATA;
memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
mbox->xferaddr = (u32)adapter->buf_dma_handle; mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
adapter->boot_ldrv_enabled = 0; adapter->boot_ldrv_enabled = 0;
adapter->boot_ldrv = 0; adapter->boot_ldrv = 0;
...@@ -4768,13 +4778,13 @@ mega_get_boot_drv(adapter_t *adapter) ...@@ -4768,13 +4778,13 @@ mega_get_boot_drv(adapter_t *adapter)
static int static int
mega_support_random_del(adapter_t *adapter) mega_support_random_del(adapter_t *adapter)
{ {
unsigned char raw_mbox[sizeof(mbox_t)]; unsigned char raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
int rval; int rval;
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
/* /*
* issue command * issue command
...@@ -4797,13 +4807,13 @@ mega_support_random_del(adapter_t *adapter) ...@@ -4797,13 +4807,13 @@ mega_support_random_del(adapter_t *adapter)
static int static int
mega_support_ext_cdb(adapter_t *adapter) mega_support_ext_cdb(adapter_t *adapter)
{ {
unsigned char raw_mbox[sizeof(mbox_t)]; unsigned char raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
int rval; int rval;
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
memset(mbox, 0, sizeof(*mbox)); memset(&mbox->m_out, 0, sizeof(raw_mbox));
/* /*
* issue command to find out if controller supports extended CDBs. * issue command to find out if controller supports extended CDBs.
*/ */
...@@ -4915,7 +4925,7 @@ mega_do_del_logdrv(adapter_t *adapter, int logdrv) ...@@ -4915,7 +4925,7 @@ mega_do_del_logdrv(adapter_t *adapter, int logdrv)
static void static void
mega_get_max_sgl(adapter_t *adapter) mega_get_max_sgl(adapter_t *adapter)
{ {
unsigned char raw_mbox[sizeof(mbox_t)]; unsigned char raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
...@@ -4924,7 +4934,7 @@ mega_get_max_sgl(adapter_t *adapter) ...@@ -4924,7 +4934,7 @@ mega_get_max_sgl(adapter_t *adapter)
memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
mbox->xferaddr = (u32)adapter->buf_dma_handle; mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
raw_mbox[0] = MAIN_MISC_OPCODE; raw_mbox[0] = MAIN_MISC_OPCODE;
raw_mbox[2] = GET_MAX_SG_SUPPORT; raw_mbox[2] = GET_MAX_SG_SUPPORT;
...@@ -4960,7 +4970,7 @@ mega_get_max_sgl(adapter_t *adapter) ...@@ -4960,7 +4970,7 @@ mega_get_max_sgl(adapter_t *adapter)
static int static int
mega_support_cluster(adapter_t *adapter) mega_support_cluster(adapter_t *adapter)
{ {
unsigned char raw_mbox[sizeof(mbox_t)]; unsigned char raw_mbox[sizeof(struct mbox_out)];
mbox_t *mbox; mbox_t *mbox;
mbox = (mbox_t *)raw_mbox; mbox = (mbox_t *)raw_mbox;
...@@ -4969,7 +4979,7 @@ mega_support_cluster(adapter_t *adapter) ...@@ -4969,7 +4979,7 @@ mega_support_cluster(adapter_t *adapter)
memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE); memset((void *)adapter->mega_buffer, 0, MEGA_BUFFER_SIZE);
mbox->xferaddr = (u32)adapter->buf_dma_handle; mbox->m_out.xferaddr = (u32)adapter->buf_dma_handle;
/* /*
* Try to get the initiator id. This command will succeed iff the * Try to get the initiator id. This command will succeed iff the
......
...@@ -120,8 +120,7 @@ ...@@ -120,8 +120,7 @@
#define NVIRT_CHAN 4 /* # of virtual channels to represent #define NVIRT_CHAN 4 /* # of virtual channels to represent
up to 60 logical drives */ up to 60 logical drives */
struct mbox_out {
typedef struct {
/* 0x0 */ u8 cmd; /* 0x0 */ u8 cmd;
/* 0x1 */ u8 cmdid; /* 0x1 */ u8 cmdid;
/* 0x2 */ u16 numsectors; /* 0x2 */ u16 numsectors;
...@@ -130,12 +129,20 @@ typedef struct { ...@@ -130,12 +129,20 @@ typedef struct {
/* 0xC */ u8 logdrv; /* 0xC */ u8 logdrv;
/* 0xD */ u8 numsgelements; /* 0xD */ u8 numsgelements;
/* 0xE */ u8 resvd; /* 0xE */ u8 resvd;
} __attribute__ ((packed));
struct mbox_in {
/* 0xF */ volatile u8 busy; /* 0xF */ volatile u8 busy;
/* 0x10 */ volatile u8 numstatus; /* 0x10 */ volatile u8 numstatus;
/* 0x11 */ volatile u8 status; /* 0x11 */ volatile u8 status;
/* 0x12 */ volatile u8 completed[MAX_FIRMWARE_STATUS]; /* 0x12 */ volatile u8 completed[MAX_FIRMWARE_STATUS];
volatile u8 poll; volatile u8 poll;
volatile u8 ack; volatile u8 ack;
} __attribute__ ((packed));
typedef struct {
struct mbox_out m_out;
struct mbox_in m_in;
} __attribute__ ((packed)) mbox_t; } __attribute__ ((packed)) mbox_t;
typedef struct { typedef struct {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment