Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[pandora-kernel.git] / drivers / scsi / megaraid / megaraid_mbox.c
index 1a3d195..cd982c8 100644 (file)
  *        2 of the License, or (at your option) any later version.
  *
  * FILE                : megaraid_mbox.c
- * Version     : v2.20.4.6 (Mar 07 2005)
+ * Version     : v2.20.4.9 (Jul 16 2006)
  *
  * Authors:
  *     Atul Mukker             <Atul.Mukker@lsil.com>
  *     Sreenivas Bagalkote     <Sreenivas.Bagalkote@lsil.com>
  *     Manoj Jose              <Manoj.Jose@lsil.com>
+ *     Seokmann Ju             <Seokmann.Ju@lsil.com>
  *
  * List of supported controllers
  *
@@ -136,7 +137,7 @@ static int wait_till_fw_empty(adapter_t *);
 
 
 
-MODULE_AUTHOR("LSI Logic Corporation");
+MODULE_AUTHOR("sju@lsil.com");
 MODULE_DESCRIPTION("LSI Logic MegaRAID Mailbox Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGARAID_VERSION);
@@ -278,68 +279,14 @@ static struct pci_device_id pci_id_table_g[] =  {
        {
                PCI_VENDOR_ID_AMI,
                PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_QC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_DC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_DELL,
-               PCI_SUBSYS_ID_PERC3_SC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_AMI,
-               PCI_SUBSYS_ID_PERC3_SC,
-       },
-       {
-               PCI_VENDOR_ID_AMI,
-               PCI_DEVICE_ID_AMI_MEGARAID3,
-               PCI_VENDOR_ID_AMI,
-               PCI_SUBSYS_ID_PERC3_DC,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_0,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_0,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_1,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_1,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SCSI_320_2,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SCSI_320_2,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_I4_133_RAID,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_I4_133_RAID,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_150_4,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_150_4,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_MEGARAID_SATA_150_6,
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_SUBSYS_ID_MEGARAID_SATA_150_6,
+               PCI_DEVICE_ID_AMI_MEGARAID3,
+               PCI_ANY_ID,
+               PCI_ANY_ID,
        },
        {
                PCI_VENDOR_ID_LSI_LOGIC,
@@ -347,18 +294,6 @@ static struct pci_device_id pci_id_table_g[] =  {
                PCI_ANY_ID,
                PCI_ANY_ID,
        },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCS16,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCS16,
-       },
-       {
-               PCI_VENDOR_ID_LSI_LOGIC,
-               PCI_DEVICE_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK,
-               PCI_VENDOR_ID_INTEL,
-               PCI_SUBSYS_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK,
-       },
        {0}     /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(pci, pci_id_table_g);
@@ -533,8 +468,6 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        // Initialize the synchronization lock for kernel and LLD
        spin_lock_init(&adapter->lock);
-       adapter->host_lock = &adapter->lock;
-
 
        // Initialize the command queues: the list of free SCBs and the list
        // of pending SCBs.
@@ -715,9 +648,6 @@ megaraid_io_attach(adapter_t *adapter)
        SCSIHOST2ADAP(host)     = (caddr_t)adapter;
        adapter->host           = host;
 
-       // export the parameters required by the mid-layer
-       scsi_assign_lock(host, adapter->host_lock);
-
        host->irq               = adapter->irq;
        host->unique_id         = adapter->unique_id;
        host->can_queue         = adapter->max_cmds;
@@ -784,12 +714,13 @@ megaraid_io_detach(adapter_t *adapter)
  * . Allocate memory required for all the commands
  * . Use internal library of FW routines, build up complete soft state
  */
-static int __init
+static int __devinit
 megaraid_init_mbox(adapter_t *adapter)
 {
        struct pci_dev          *pdev;
        mraid_device_t          *raid_dev;
        int                     i;
+       uint32_t                magic64;
 
 
        adapter->ito    = MBOX_TIMEOUT;
@@ -837,7 +768,7 @@ megaraid_init_mbox(adapter_t *adapter)
        //
 
        // request IRQ and register the interrupt service routine
-       if (request_irq(adapter->irq, megaraid_isr, SA_SHIRQ, "megaraid",
+       if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid",
                adapter)) {
 
                con_log(CL_ANN, (KERN_WARNING
@@ -933,12 +864,33 @@ megaraid_init_mbox(adapter_t *adapter)
 
        // Set the DMA mask to 64-bit. All supported controllers as capable of
        // DMA in this range
-       if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK) != 0) {
-
-               con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: could not set DMA mask for 64-bit.\n"));
+       pci_read_config_dword(adapter->pdev, PCI_CONF_AMISIG64, &magic64);
+
+       if (((magic64 == HBA_SIGNATURE_64_BIT) &&
+               ((adapter->pdev->subsystem_device !=
+               PCI_SUBSYS_ID_MEGARAID_SATA_150_6) ||
+               (adapter->pdev->subsystem_device !=
+               PCI_SUBSYS_ID_MEGARAID_SATA_150_4))) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+               adapter->pdev->device == PCI_DEVICE_ID_VERDE) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+               adapter->pdev->device == PCI_DEVICE_ID_DOBSON) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_LSI_LOGIC &&
+               adapter->pdev->device == PCI_DEVICE_ID_LINDSAY) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_DELL &&
+               adapter->pdev->device == PCI_DEVICE_ID_PERC4_DI_EVERGLADES) ||
+               (adapter->pdev->vendor == PCI_VENDOR_ID_DELL &&
+               adapter->pdev->device == PCI_DEVICE_ID_PERC4E_DI_KOBUK)) {
+               if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK)) {
+                       con_log(CL_ANN, (KERN_WARNING
+                               "megaraid: DMA mask for 64-bit failed\n"));
 
-               goto out_free_sysfs_res;
+                       if (pci_set_dma_mask (adapter->pdev, DMA_32BIT_MASK)) {
+                               con_log(CL_ANN, (KERN_WARNING
+                                       "megaraid: 32-bit DMA mask failed\n"));
+                               goto out_free_sysfs_res;
+                       }
+               }
        }
 
        // setup tasklet for DPC
@@ -1336,7 +1288,7 @@ megaraid_mbox_teardown_dma_pools(adapter_t *adapter)
  * return the scb from the head of the free list. NULL if there are none
  * available
  **/
-static inline scb_t *
+static scb_t *
 megaraid_alloc_scb(adapter_t *adapter, struct scsi_cmnd *scp)
 {
        struct list_head        *head = &adapter->kscb_pool;
@@ -1399,7 +1351,7 @@ megaraid_dealloc_scb(adapter_t *adapter, scb_t *scb)
  *
  * prepare the scatter-gather list
  */
-static inline int
+static int
 megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
 {
        struct scatterlist      *sgl;
@@ -1472,7 +1424,7 @@ megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
  *
  * post the command to the controller if mailbox is availble.
  */
-static inline int
+static int
 mbox_post_cmd(adapter_t *adapter, scb_t *scb)
 {
        mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
@@ -1560,10 +1512,6 @@ megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
        scp->scsi_done  = done;
        scp->result     = 0;
 
-       assert_spin_locked(adapter->host_lock);
-
-       spin_unlock(adapter->host_lock);
-
        /*
         * Allocate and build a SCB request
         * if_busy flag will be set if megaraid_mbox_build_cmd() command could
@@ -1573,23 +1521,16 @@ megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
         * return 0 in that case, and we would do the callback right away.
         */
        if_busy = 0;
-       scb     = megaraid_mbox_build_cmd(adapter, scp, &if_busy);
-
-       if (scb) {
-               megaraid_mbox_runpendq(adapter, scb);
-       }
-
-       spin_lock(adapter->host_lock);
-
+       scb = megaraid_mbox_build_cmd(adapter, scp, &if_busy);
        if (!scb) {     // command already completed
                done(scp);
                return 0;
        }
 
+       megaraid_mbox_runpendq(adapter, scb);
        return if_busy;
 }
 
-
 /**
  * megaraid_mbox_build_cmd - transform the mid-layer scsi command to megaraid
  * firmware lingua
@@ -1703,6 +1644,14 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
                                rdev->last_disp |= (1L << SCP2CHANNEL(scp));
                        }
 
+                       if (scp->cmnd[1] & MEGA_SCSI_INQ_EVPD) {
+                               scp->sense_buffer[0] = 0x70;
+                               scp->sense_buffer[2] = ILLEGAL_REQUEST;
+                               scp->sense_buffer[12] = MEGA_INVALID_FIELD_IN_CDB;
+                               scp->result = CHECK_CONDITION << 1;
+                               return NULL;
+                       }
+
                        /* Fall through */
 
                case READ_CAPACITY:
@@ -2151,7 +2100,7 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
  *
  * Returns:    1 if the interrupt is valid, 0 otherwise
  */
-static inline int
+static int
 megaraid_ack_sequence(adapter_t *adapter)
 {
        mraid_device_t          *raid_dev = ADAP2RAIDDEV(adapter);
@@ -2289,7 +2238,7 @@ megaraid_isr(int irq, void *devp, struct pt_regs *regs)
  *
  * DMA sync if required.
  */
-static inline void
+static void
 megaraid_mbox_sync_scb(adapter_t *adapter, scb_t *scb)
 {
        mbox_ccb_t      *ccb;
@@ -2359,6 +2308,7 @@ megaraid_mbox_dpc(unsigned long devp)
        unsigned long           flags;
        uint8_t                 c;
        int                     status;
+       uioc_t                  *kioc;
 
 
        if (!adapter) return;
@@ -2401,6 +2351,9 @@ megaraid_mbox_dpc(unsigned long devp)
                        // remove from local clist
                        list_del_init(&scb->list);
 
+                       kioc                    = (uioc_t *)scb->gp;
+                       kioc->status            = 0;
+
                        megaraid_mbox_mm_done(adapter, scb);
 
                        continue;
@@ -2546,9 +2499,7 @@ megaraid_mbox_dpc(unsigned long devp)
                megaraid_dealloc_scb(adapter, scb);
 
                // send the scsi packet back to kernel
-               spin_lock(adapter->host_lock);
                scp->scsi_done(scp);
-               spin_unlock(adapter->host_lock);
        }
 
        return;
@@ -2563,7 +2514,7 @@ megaraid_mbox_dpc(unsigned long devp)
  * aborted. All the commands issued to the F/W must complete.
  **/
 static int
-__megaraid_abort_handler(struct scsi_cmnd *scp)
+megaraid_abort_handler(struct scsi_cmnd *scp)
 {
        adapter_t               *adapter;
        mraid_device_t          *raid_dev;
@@ -2577,8 +2528,6 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        adapter         = SCP2ADAPTER(scp);
        raid_dev        = ADAP2RAIDDEV(adapter);
 
-       assert_spin_locked(adapter->host_lock);
-
        con_log(CL_ANN, (KERN_WARNING
                "megaraid: aborting-%ld cmd=%x <c=%d t=%d l=%d>\n",
                scp->serial_number, scp->cmnd[0], SCP2CHANNEL(scp),
@@ -2658,6 +2607,7 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        // traverse through the list of all SCB, since driver does not
        // maintain these SCBs on any list
        found = 0;
+       spin_lock_irq(&adapter->lock);
        for (i = 0; i < MBOX_MAX_SCSI_CMDS; i++) {
                scb = adapter->kscb_list + i;
 
@@ -2680,6 +2630,7 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
                        }
                }
        }
+       spin_unlock_irq(&adapter->lock);
 
        if (!found) {
                con_log(CL_ANN, (KERN_WARNING
@@ -2696,22 +2647,6 @@ __megaraid_abort_handler(struct scsi_cmnd *scp)
        return FAILED;
 }
 
-static int
-megaraid_abort_handler(struct scsi_cmnd *scp)
-{
-       adapter_t       *adapter;
-       int rc;
-
-       adapter         = SCP2ADAPTER(scp);
-
-       spin_lock_irq(adapter->host_lock);
-       rc = __megaraid_abort_handler(scp);
-       spin_unlock_irq(adapter->host_lock);
-
-       return rc;
-}
-
-
 /**
  * megaraid_reset_handler - device reset hadler for mailbox based driver
  * @scp                : reference command
@@ -2723,7 +2658,7 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
  * host
  **/
 static int
-__megaraid_reset_handler(struct scsi_cmnd *scp)
+megaraid_reset_handler(struct scsi_cmnd *scp)
 {
        adapter_t       *adapter;
        scb_t           *scb;
@@ -2735,14 +2670,11 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
        int             recovery_window;
        int             recovering;
        int             i;
+       uioc_t          *kioc;
 
        adapter         = SCP2ADAPTER(scp);
        raid_dev        = ADAP2RAIDDEV(adapter);
 
-       assert_spin_locked(adapter->host_lock);
-
-       con_log(CL_ANN, (KERN_WARNING "megaraid: reseting the host...\n"));
-
        // return failure if adapter is not responding
        if (raid_dev->hw_error) {
                con_log(CL_ANN, (KERN_NOTICE
@@ -2758,34 +2690,51 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
        // Also, reset all the commands currently owned by the driver
        spin_lock_irqsave(PENDING_LIST_LOCK(adapter), flags);
        list_for_each_entry_safe(scb, tmp, &adapter->pend_list, list) {
-
                list_del_init(&scb->list);      // from pending list
 
-               con_log(CL_ANN, (KERN_WARNING
-                       "megaraid: %ld:%d[%d:%d], reset from pending list\n",
-                               scp->serial_number, scb->sno,
-                               scb->dev_channel, scb->dev_target));
+               if (scb->sno >= MBOX_MAX_SCSI_CMDS) {
+                       con_log(CL_ANN, (KERN_WARNING
+                       "megaraid: IOCTL packet with %d[%d:%d] being reset\n",
+                       scb->sno, scb->dev_channel, scb->dev_target));
 
-               scp->result = (DID_RESET << 16);
-               scp->scsi_done(scp);
+                       scb->status = -1;
 
-               megaraid_dealloc_scb(adapter, scb);
+                       kioc                    = (uioc_t *)scb->gp;
+                       kioc->status            = -EFAULT;
+
+                       megaraid_mbox_mm_done(adapter, scb);
+               } else {
+                       if (scb->scp == scp) {  // Found command
+                               con_log(CL_ANN, (KERN_WARNING
+                                       "megaraid: %ld:%d[%d:%d], reset from pending list\n",
+                                       scp->serial_number, scb->sno,
+                                       scb->dev_channel, scb->dev_target));
+                       } else {
+                               con_log(CL_ANN, (KERN_WARNING
+                               "megaraid: IO packet with %d[%d:%d] being reset\n",
+                               scb->sno, scb->dev_channel, scb->dev_target));
+                       }
+
+                       scb->scp->result = (DID_RESET << 16);
+                       scb->scp->scsi_done(scb->scp);
+
+                       megaraid_dealloc_scb(adapter, scb);
+               }
        }
        spin_unlock_irqrestore(PENDING_LIST_LOCK(adapter), flags);
 
        if (adapter->outstanding_cmds) {
                con_log(CL_ANN, (KERN_NOTICE
                        "megaraid: %d outstanding commands. Max wait %d sec\n",
-                       adapter->outstanding_cmds, MBOX_RESET_WAIT));
+                       adapter->outstanding_cmds,
+                       (MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT)));
        }
 
-       spin_unlock(adapter->host_lock);
-
        recovery_window = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
 
        recovering = adapter->outstanding_cmds;
 
-       for (i = 0; i < recovery_window && adapter->outstanding_cmds; i++) {
+       for (i = 0; i < recovery_window; i++) {
 
                megaraid_ack_sequence(adapter);
 
@@ -2794,19 +2743,18 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
                        con_log(CL_ANN, (
                        "megaraid mbox: Wait for %d commands to complete:%d\n",
                                adapter->outstanding_cmds,
-                               MBOX_RESET_WAIT - i));
+                               (MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT) - i));
                }
 
                // bailout if no recovery happended in reset time
-               if ((i == MBOX_RESET_WAIT) &&
-                       (recovering == adapter->outstanding_cmds)) {
+               if (adapter->outstanding_cmds == 0) {
                        break;
                }
 
                msleep(1000);
        }
 
-       spin_lock(adapter->host_lock);
+       spin_lock(&adapter->lock);
 
        // If still outstanding commands, bail out
        if (adapter->outstanding_cmds) {
@@ -2815,7 +2763,8 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
 
                raid_dev->hw_error = 1;
 
-               return FAILED;
+               rval = FAILED;
+               goto out;
        }
        else {
                con_log(CL_ANN, (KERN_NOTICE
@@ -2824,7 +2773,10 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
 
 
        // If the controller supports clustering, reset reservations
-       if (!adapter->ha) return SUCCESS;
+       if (!adapter->ha) {
+               rval = SUCCESS;
+               goto out;
+       }
 
        // clear reservations if any
        raw_mbox[0] = CLUSTER_CMD;
@@ -2841,22 +2793,11 @@ __megaraid_reset_handler(struct scsi_cmnd *scp)
                                "megaraid: reservation reset failed\n"));
        }
 
+ out:
+       spin_unlock_irq(&adapter->lock);
        return rval;
 }
 
-static int
-megaraid_reset_handler(struct scsi_cmnd *cmd)
-{
-       int rc;
-
-       spin_lock_irq(cmd->device->host->host_lock);
-       rc = __megaraid_reset_handler(cmd);
-       spin_unlock_irq(cmd->device->host->host_lock);
-
-       return rc;
-}
-
-
 /*
  * START: internal commands library
  *
@@ -2909,7 +2850,7 @@ mbox_post_sync_cmd(adapter_t *adapter, uint8_t raw_mbox[])
        // available within 1 second, assume FW is initializing and wait
        // for an extended amount of time
        if (mbox->numstatus == 0xFF) {  // status not yet available
-               udelay(25);;
+               udelay(25);
 
                for (i = 0; mbox->numstatus == 0xFF && i < 1000; i++) {
                        rmb();
@@ -3030,11 +2971,13 @@ mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[])
        wmb();
        WRINDOOR(raid_dev, raid_dev->mbox_dma | 0x1);
 
-       for (i = 0; i < 0xFFFFF; i++) {
+       for (i = 0; i < MBOX_SYNC_WAIT_CNT; i++) {
                if (mbox->numstatus != 0xFF) break;
+               rmb();
+               udelay(MBOX_SYNC_DELAY_200);
        }
 
-       if (i == 0xFFFFF) {
+       if (i == MBOX_SYNC_WAIT_CNT) {
                // We may need to re-calibrate the counter
                con_log(CL_ANN, (KERN_CRIT
                        "megaraid: fast sync command timed out\n"));
@@ -3586,7 +3529,7 @@ megaraid_cmm_register(adapter_t *adapter)
        adp.drvr_data           = (unsigned long)adapter;
        adp.pdev                = adapter->pdev;
        adp.issue_uioc          = megaraid_mbox_mm_handler;
-       adp.timeout             = 300;
+       adp.timeout             = MBOX_RESET_WAIT + MBOX_RESET_EXT_WAIT;
        adp.max_kioc            = MBOX_MAX_USER_CMDS;
 
        if ((rval = mraid_mm_register_adp(&adp)) != 0) {
@@ -3776,9 +3719,9 @@ wait_till_fw_empty(adapter_t *adapter)
        /*
         * Set the quiescent flag to stop issuing cmds to FW.
         */
-       spin_lock_irqsave(adapter->host_lock, flags);
+       spin_lock_irqsave(&adapter->lock, flags);
        adapter->quiescent++;
-       spin_unlock_irqrestore(adapter->host_lock, flags);
+       spin_unlock_irqrestore(&adapter->lock, flags);
 
        /*
         * Wait till there are no more cmds outstanding at FW. Try for at most
@@ -3813,7 +3756,6 @@ megaraid_mbox_mm_done(adapter_t *adapter, scb_t *scb)
        unsigned long           flags;
 
        kioc                    = (uioc_t *)scb->gp;
-       kioc->status            = 0;
        mbox64                  = (mbox64_t *)(unsigned long)kioc->cmdbuf;
        mbox64->mbox32.status   = scb->status;
        raw_mbox                = (uint8_t *)&mbox64->mbox32;