module_param(free_ports, bool, 0);
 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))");
 
+static struct scsi_pointer *nsp_priv(struct scsi_cmnd *cmd)
+{
+       return scsi_cmd_priv(cmd);
+}
+
 static struct scsi_host_template nsp_driver_template = {
        .proc_name               = "nsp_cs",
        .show_info               = nsp_show_info,
        .this_id                 = NSP_INITIATOR_ID,
        .sg_tablesize            = SG_ALL,
        .dma_boundary            = PAGE_SIZE - 1,
+       .cmd_size                = sizeof(struct scsi_pointer),
 };
 
 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */
        scsi_done(SCpnt);
 }
 
-static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt)
+static int nsp_queuecommand_lck(struct scsi_cmnd *const SCpnt)
 {
+       struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
 #ifdef NSP_DEBUG
        /*unsigned int host_id = SCpnt->device->host->this_id;*/
        /*unsigned int base    = SCpnt->device->host->io_port;*/
 
        data->CurrentSC         = SCpnt;
 
-       SCpnt->SCp.Status       = SAM_STAT_CHECK_CONDITION;
-       SCpnt->SCp.Message      = 0;
-       SCpnt->SCp.have_data_in = IO_UNKNOWN;
-       SCpnt->SCp.sent_command = 0;
-       SCpnt->SCp.phase        = PH_UNDETERMINED;
+       scsi_pointer->Status       = SAM_STAT_CHECK_CONDITION;
+       scsi_pointer->Message      = 0;
+       scsi_pointer->have_data_in = IO_UNKNOWN;
+       scsi_pointer->sent_command = 0;
+       scsi_pointer->phase        = PH_UNDETERMINED;
        scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
 
        /* setup scratch area
           SCp.buffers_residual : left buffers in list
           SCp.phase            : current state of the command */
        if (scsi_bufflen(SCpnt)) {
-               SCpnt->SCp.buffer           = scsi_sglist(SCpnt);
-               SCpnt->SCp.ptr              = BUFFER_ADDR;
-               SCpnt->SCp.this_residual    = SCpnt->SCp.buffer->length;
-               SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1;
+               scsi_pointer->buffer           = scsi_sglist(SCpnt);
+               scsi_pointer->ptr              = BUFFER_ADDR(SCpnt);
+               scsi_pointer->this_residual    = scsi_pointer->buffer->length;
+               scsi_pointer->buffers_residual = scsi_sg_count(SCpnt) - 1;
        } else {
-               SCpnt->SCp.ptr              = NULL;
-               SCpnt->SCp.this_residual    = 0;
-               SCpnt->SCp.buffer           = NULL;
-               SCpnt->SCp.buffers_residual = 0;
+               scsi_pointer->ptr              = NULL;
+               scsi_pointer->this_residual    = 0;
+               scsi_pointer->buffer           = NULL;
+               scsi_pointer->buffers_residual = 0;
        }
 
        if (!nsphw_start_selection(SCpnt)) {
 /*
  * Start selection phase
  */
-static bool nsphw_start_selection(struct scsi_cmnd *SCpnt)
+static bool nsphw_start_selection(struct scsi_cmnd *const SCpnt)
 {
+       struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
        unsigned int  host_id    = SCpnt->device->host->this_id;
        unsigned int  base       = SCpnt->device->host->io_port;
        unsigned char target     = scmd_id(SCpnt);
 
        /* start arbitration */
        //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit");
-       SCpnt->SCp.phase = PH_ARBSTART;
+       scsi_pointer->phase = PH_ARBSTART;
        nsp_index_write(base, SETARBIT, ARBIT_GO);
 
        time_out = 1000;
 
        /* assert select line */
        //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line");
-       SCpnt->SCp.phase = PH_SELSTART;
+       scsi_pointer->phase = PH_SELSTART;
        udelay(3); /* wait 2.4us */
        nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target));
        nsp_index_write(base, SCSIBUSCTRL,   SCSI_SEL | SCSI_BSY                    | SCSI_ATN);
 /*
  * transfer SCSI message
  */
-static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase)
+static int nsp_xfer(struct scsi_cmnd *const SCpnt, int phase)
 {
+       struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
        unsigned int  base = SCpnt->device->host->io_port;
        nsp_hw_data  *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
        char         *buf  = data->MsgBuffer;
                }
 
                /* if last byte, negate ATN */
-               if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) {
+               if (len == 1 && scsi_pointer->phase == PH_MSG_OUT) {
                        nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB);
                }
 
 /*
  * get extra SCSI data from fifo
  */
-static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt)
+static int nsp_dataphase_bypass(struct scsi_cmnd *const SCpnt)
 {
+       struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
        nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata;
        unsigned int count;
 
        //nsp_dbg(NSP_DEBUG_DATA_IO, "in");
 
-       if (SCpnt->SCp.have_data_in != IO_IN) {
+       if (scsi_pointer->have_data_in != IO_IN) {
                return 0;
        }
 
         * data phase skip only occures in case of SCSI_LOW_READ
         */
        nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk");
-       SCpnt->SCp.phase = PH_DATA;
+       scsi_pointer->phase = PH_DATA;
        nsp_pio_read(SCpnt);
        nsp_setup_fifo(data, false);
 
 /*
  * read data in DATA IN phase
  */
-static void nsp_pio_read(struct scsi_cmnd *SCpnt)
+static void nsp_pio_read(struct scsi_cmnd *const SCpnt)
 {
+       struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
        unsigned int  base      = SCpnt->device->host->io_port;
        unsigned long mmio_base = SCpnt->device->host->base;
        nsp_hw_data  *data      = (nsp_hw_data *)SCpnt->device->host->hostdata;
        ocount = data->FifoCount;
 
        nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d",
-               SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr,
-               SCpnt->SCp.this_residual, SCpnt->SCp.buffer,
-               SCpnt->SCp.buffers_residual);
+               SCpnt, scsi_get_resid(SCpnt), ocount, scsi_pointer->ptr,
+               scsi_pointer->this_residual, scsi_pointer->buffer,
+               scsi_pointer->buffers_residual);
 
        time_out = 1000;
 
        while ((time_out-- != 0) &&
-              (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) {
+              (scsi_pointer->this_residual > 0 ||
+               scsi_pointer->buffers_residual > 0)) {
 
                stat = nsp_index_read(base, SCSIBUSMON);
                stat &= BUSMON_PHASE_MASK;
 
 
                res = nsp_fifo_count(SCpnt) - ocount;
-               //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res);
+               //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", scsi_pointer->ptr, scsi_pointer->this_residual, ocount, res);
                if (res == 0) { /* if some data available ? */
                        if (stat == BUSPHASE_DATA_IN) { /* phase changed? */
-                               //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual);
+                               //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", scsi_pointer->this_residual);
                                continue;
                        } else {
                                nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat);
                        continue;
                }
 
-               res = min(res, SCpnt->SCp.this_residual);
+               res = min(res, scsi_pointer->this_residual);
 
                switch (data->TransferMode) {
                case MODE_IO32:
                        res &= ~(BIT(1)|BIT(0)); /* align 4 */
-                       nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2);
+                       nsp_fifo32_read(base, scsi_pointer->ptr, res >> 2);
                        break;
                case MODE_IO8:
-                       nsp_fifo8_read (base, SCpnt->SCp.ptr, res     );
+                       nsp_fifo8_read(base, scsi_pointer->ptr, res);
                        break;
 
                case MODE_MEM32:
                        res &= ~(BIT(1)|BIT(0)); /* align 4 */
-                       nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2);
+                       nsp_mmio_fifo32_read(mmio_base, scsi_pointer->ptr,
+                                            res >> 2);
                        break;
 
                default:
                }
 
                nsp_inc_resid(SCpnt, -res);
-               SCpnt->SCp.ptr           += res;
-               SCpnt->SCp.this_residual -= res;
+               scsi_pointer->ptr += res;
+               scsi_pointer->this_residual -= res;
                ocount                   += res;
-               //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount);
+               //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", scsi_pointer->ptr, scsi_pointer->this_residual, ocount);
 
                /* go to next scatter list if available */
-               if (SCpnt->SCp.this_residual    == 0 &&
-                   SCpnt->SCp.buffers_residual != 0 ) {
+               if (scsi_pointer->this_residual == 0 &&
+                   scsi_pointer->buffers_residual != 0 ) {
                        //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out);
-                       SCpnt->SCp.buffers_residual--;
-                       SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer);
-                       SCpnt->SCp.ptr           = BUFFER_ADDR;
-                       SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
+                       scsi_pointer->buffers_residual--;
+                       scsi_pointer->buffer = sg_next(scsi_pointer->buffer);
+                       scsi_pointer->ptr = BUFFER_ADDR(SCpnt);
+                       scsi_pointer->this_residual =
+                               scsi_pointer->buffer->length;
                        time_out = 1000;
 
-                       //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset);
+                       //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", scsi_pointer->buffer->page, scsi_pointer->buffer->offset);
                }
        }
 
 
        if (time_out < 0) {
                nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d",
-                       scsi_get_resid(SCpnt), SCpnt->SCp.this_residual,
-                       SCpnt->SCp.buffers_residual);
+                       scsi_get_resid(SCpnt), scsi_pointer->this_residual,
+                       scsi_pointer->buffers_residual);
        }
        nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount);
        nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId,
  */
 static void nsp_pio_write(struct scsi_cmnd *SCpnt)
 {
+       struct scsi_pointer *scsi_pointer = nsp_priv(SCpnt);
        unsigned int  base      = SCpnt->device->host->io_port;
        unsigned long mmio_base = SCpnt->device->host->base;
        nsp_hw_data  *data      = (nsp_hw_data *)SCpnt->device->host->hostdata;
        ocount   = data->FifoCount;
 
        nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x",
-               data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual,
-               SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual,
+               data->FifoCount, scsi_pointer->ptr, scsi_pointer->this_residual,
+               scsi_pointer->buffer, scsi_pointer->buffers_residual,
                scsi_get_resid(SCpnt));
 
        time_out = 1000;
 
        while ((time_out-- != 0) &&
-              (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) {
+              (scsi_pointer->this_residual > 0 ||
+               scsi_pointer->buffers_residual > 0)) {
                stat = nsp_index_read(base, SCSIBUSMON);
                stat &= BUSMON_PHASE_MASK;
 
                        nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res);
                        /* Put back pointer */
                        nsp_inc_resid(SCpnt, res);
-                       SCpnt->SCp.ptr           -= res;
-                       SCpnt->SCp.this_residual += res;
-                       ocount                   -= res;
+                       scsi_pointer->ptr -= res;
+                       scsi_pointer->this_residual += res;
+                       ocount -= res;
 
                        break;
                }
                        continue;
                }
 
-               res = min(SCpnt->SCp.this_residual, WFIFO_CRIT);
+               res = min(scsi_pointer->this_residual, WFIFO_CRIT);
 
-               //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res);
+               //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", scsi_pointer->ptr, scsi_pointer->this_residual, res);
                switch (data->TransferMode) {
                case MODE_IO32:
                        res &= ~(BIT(1)|BIT(0)); /* align 4 */
-                       nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2);
+                       nsp_fifo32_write(base, scsi_pointer->ptr, res >> 2);
                        break;
                case MODE_IO8:
-                       nsp_fifo8_write (base, SCpnt->SCp.ptr, res     );
+                       nsp_fifo8_write(base, scsi_pointer->ptr, res);
                        break;
 
                case MODE_MEM32:
                        res &= ~(BIT(1)|BIT(0)); /* align 4 */
-                       nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2);
+                       nsp_mmio_fifo32_write(mmio_base, scsi_pointer->ptr,
+                                             res >> 2);
                        break;
 
                default:
                }
 
                nsp_inc_resid(SCpnt, -res);
-               SCpnt->SCp.ptr           += res;
-               SCpnt->SCp.this_residual -= res;
-               ocount                   += res;
+               scsi_pointer->ptr += res;
+               scsi_pointer->this_residual -= res;
+               ocount += res;
 
                /* go to next scatter list if available */
-               if (SCpnt->SCp.this_residual    == 0 &&
-                   SCpnt->SCp.buffers_residual != 0 ) {
+               if (scsi_pointer->this_residual == 0 &&
+                   scsi_pointer->buffers_residual != 0 ) {
                        //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next");
-                       SCpnt->SCp.buffers_residual--;
-                       SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer);
-                       SCpnt->SCp.ptr           = BUFFER_ADDR;
-                       SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
+                       scsi_pointer->buffers_residual--;
+                       scsi_pointer->buffer = sg_next(scsi_pointer->buffer);
+                       scsi_pointer->ptr = BUFFER_ADDR(SCpnt);
+                       scsi_pointer->this_residual =
+                               scsi_pointer->buffer->length;
                        time_out = 1000;
                }
        }
        unsigned int   base;
        unsigned char  irq_status, irq_phase, phase;
        struct scsi_cmnd *tmpSC;
+       struct scsi_pointer *scsi_pointer;
        unsigned char  target, lun;
        unsigned int  *sync_neg;
        int            i, tmp;
 
                if(data->CurrentSC != NULL) {
                        tmpSC = data->CurrentSC;
-                       tmpSC->result  = (DID_RESET                   << 16) |
-                                        ((tmpSC->SCp.Message & 0xff) <<  8) |
-                                        ((tmpSC->SCp.Status  & 0xff) <<  0);
+                       scsi_pointer = nsp_priv(tmpSC);
+                       tmpSC->result = (DID_RESET              << 16) |
+                               ((scsi_pointer->Message & 0xff) <<  8) |
+                               ((scsi_pointer->Status  & 0xff) <<  0);
                        nsp_scsi_done(tmpSC);
                }
                return IRQ_HANDLED;
        }
 
        tmpSC    = data->CurrentSC;
+       scsi_pointer = nsp_priv(tmpSC);
        target   = tmpSC->device->id;
        lun      = tmpSC->device->lun;
        sync_neg = &(data->Sync[target].SyncNegotiation);
 
        //show_phase(tmpSC);
 
-       switch(tmpSC->SCp.phase) {
+       switch (scsi_pointer->phase) {
        case PH_SELSTART:
                // *sync_neg = SYNC_NOT_YET;
                if ((phase & BUSMON_BSY) == 0) {
                /* attention assert */
                //nsp_dbg(NSP_DEBUG_INTR, "attention assert");
                data->SelectionTimeOut = 0;
-               tmpSC->SCp.phase       = PH_SELECTED;
+               scsi_pointer->phase = PH_SELECTED;
                nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN);
                udelay(1);
                nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB);
        //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq");
 
        /* normal disconnect */
-       if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) &&
-           (irq_phase & LATCHED_BUS_FREE) != 0 ) {
+       if ((scsi_pointer->phase == PH_MSG_IN ||
+            scsi_pointer->phase == PH_MSG_OUT) &&
+           (irq_phase & LATCHED_BUS_FREE) != 0) {
                nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase);
 
                //*sync_neg       = SYNC_NOT_YET;
 
                /* all command complete and return status */
-               if (tmpSC->SCp.Message == COMMAND_COMPLETE) {
-                       tmpSC->result = (DID_OK                      << 16) |
-                                       ((tmpSC->SCp.Message & 0xff) <<  8) |
-                                       ((tmpSC->SCp.Status  & 0xff) <<  0);
+               if (scsi_pointer->Message == COMMAND_COMPLETE) {
+                       tmpSC->result = (DID_OK                 << 16) |
+                               ((scsi_pointer->Message & 0xff) <<  8) |
+                               ((scsi_pointer->Status  & 0xff) <<  0);
                        nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result);
                        nsp_scsi_done(tmpSC);
 
                        return IRQ_HANDLED;
                }
 
-               tmpSC->SCp.phase = PH_COMMAND;
+               scsi_pointer->phase = PH_COMMAND;
 
                nsp_nexus(tmpSC);
 
        case BUSPHASE_DATA_OUT:
                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT");
 
-               tmpSC->SCp.phase        = PH_DATA;
-               tmpSC->SCp.have_data_in = IO_OUT;
+               scsi_pointer->phase        = PH_DATA;
+               scsi_pointer->have_data_in = IO_OUT;
 
                nsp_pio_write(tmpSC);
 
        case BUSPHASE_DATA_IN:
                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN");
 
-               tmpSC->SCp.phase        = PH_DATA;
-               tmpSC->SCp.have_data_in = IO_IN;
+               scsi_pointer->phase        = PH_DATA;
+               scsi_pointer->have_data_in = IO_IN;
 
                nsp_pio_read(tmpSC);
 
                nsp_dataphase_bypass(tmpSC);
                nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS");
 
-               tmpSC->SCp.phase = PH_STATUS;
+               scsi_pointer->phase = PH_STATUS;
 
-               tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK);
-               nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status);
+               scsi_pointer->Status = nsp_index_read(base, SCSIDATAWITHACK);
+               nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x",
+                       scsi_pointer->Message, scsi_pointer->Status);
 
                break;
 
                        goto timer_out;
                }
 
-               tmpSC->SCp.phase = PH_MSG_OUT;
+               scsi_pointer->phase = PH_MSG_OUT;
 
                //*sync_neg = SYNC_NOT_YET;
 
                        goto timer_out;
                }
 
-               tmpSC->SCp.phase = PH_MSG_IN;
+               scsi_pointer->phase = PH_MSG_IN;
                nsp_message_in(tmpSC);
 
                /**/
                                i += (1 + data->MsgBuffer[i+1]);
                        }
                }
-               tmpSC->SCp.Message = tmp;
+               scsi_pointer->Message = tmp;
 
-               nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen);
+               nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d",
+                       scsi_pointer->Message, data->MsgLen);
                show_message(data);
 
                break;