|
@@ -559,7 +559,7 @@ static void mtip_timeout_function(unsigned long int data)
|
|
struct mtip_cmd *command;
|
|
struct mtip_cmd *command;
|
|
int tag, cmdto_cnt = 0;
|
|
int tag, cmdto_cnt = 0;
|
|
unsigned int bit, group;
|
|
unsigned int bit, group;
|
|
- unsigned int num_command_slots = port->dd->slot_groups * 32;
|
|
|
|
|
|
+ unsigned int num_command_slots;
|
|
unsigned long to, tagaccum[SLOTBITS_IN_LONGS];
|
|
unsigned long to, tagaccum[SLOTBITS_IN_LONGS];
|
|
|
|
|
|
if (unlikely(!port))
|
|
if (unlikely(!port))
|
|
@@ -572,6 +572,7 @@ static void mtip_timeout_function(unsigned long int data)
|
|
}
|
|
}
|
|
/* clear the tag accumulator */
|
|
/* clear the tag accumulator */
|
|
memset(tagaccum, 0, SLOTBITS_IN_LONGS * sizeof(long));
|
|
memset(tagaccum, 0, SLOTBITS_IN_LONGS * sizeof(long));
|
|
|
|
+ num_command_slots = port->dd->slot_groups * 32;
|
|
|
|
|
|
for (tag = 0; tag < num_command_slots; tag++) {
|
|
for (tag = 0; tag < num_command_slots; tag++) {
|
|
/*
|
|
/*
|
|
@@ -2218,8 +2219,8 @@ static int exec_drive_taskfile(struct driver_data *dd,
|
|
fis.device);
|
|
fis.device);
|
|
|
|
|
|
/* check for erase mode support during secure erase.*/
|
|
/* check for erase mode support during secure erase.*/
|
|
- if ((fis.command == ATA_CMD_SEC_ERASE_UNIT)
|
|
|
|
- && (outbuf[0] & MTIP_SEC_ERASE_MODE)) {
|
|
|
|
|
|
+ if ((fis.command == ATA_CMD_SEC_ERASE_UNIT) && outbuf &&
|
|
|
|
+ (outbuf[0] & MTIP_SEC_ERASE_MODE)) {
|
|
erasemode = 1;
|
|
erasemode = 1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2439,7 +2440,7 @@ static int mtip_hw_ioctl(struct driver_data *dd, unsigned int cmd,
|
|
* return value
|
|
* return value
|
|
* None
|
|
* None
|
|
*/
|
|
*/
|
|
-static void mtip_hw_submit_io(struct driver_data *dd, sector_t start,
|
|
|
|
|
|
+static void mtip_hw_submit_io(struct driver_data *dd, sector_t sector,
|
|
int nsect, int nents, int tag, void *callback,
|
|
int nsect, int nents, int tag, void *callback,
|
|
void *data, int dir)
|
|
void *data, int dir)
|
|
{
|
|
{
|
|
@@ -2447,6 +2448,7 @@ static void mtip_hw_submit_io(struct driver_data *dd, sector_t start,
|
|
struct mtip_port *port = dd->port;
|
|
struct mtip_port *port = dd->port;
|
|
struct mtip_cmd *command = &port->commands[tag];
|
|
struct mtip_cmd *command = &port->commands[tag];
|
|
int dma_dir = (dir == READ) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
|
|
int dma_dir = (dir == READ) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
|
|
|
|
+ u64 start = sector;
|
|
|
|
|
|
/* Map the scatter list for DMA access */
|
|
/* Map the scatter list for DMA access */
|
|
nents = dma_map_sg(&dd->pdev->dev, command->sg, nents, dma_dir);
|
|
nents = dma_map_sg(&dd->pdev->dev, command->sg, nents, dma_dir);
|
|
@@ -2465,8 +2467,12 @@ static void mtip_hw_submit_io(struct driver_data *dd, sector_t start,
|
|
fis->opts = 1 << 7;
|
|
fis->opts = 1 << 7;
|
|
fis->command =
|
|
fis->command =
|
|
(dir == READ ? ATA_CMD_FPDMA_READ : ATA_CMD_FPDMA_WRITE);
|
|
(dir == READ ? ATA_CMD_FPDMA_READ : ATA_CMD_FPDMA_WRITE);
|
|
- *((unsigned int *) &fis->lba_low) = (start & 0xFFFFFF);
|
|
|
|
- *((unsigned int *) &fis->lba_low_ex) = ((start >> 24) & 0xFFFFFF);
|
|
|
|
|
|
+ fis->lba_low = start & 0xFF;
|
|
|
|
+ fis->lba_mid = (start >> 8) & 0xFF;
|
|
|
|
+ fis->lba_hi = (start >> 16) & 0xFF;
|
|
|
|
+ fis->lba_low_ex = (start >> 24) & 0xFF;
|
|
|
|
+ fis->lba_mid_ex = (start >> 32) & 0xFF;
|
|
|
|
+ fis->lba_hi_ex = (start >> 40) & 0xFF;
|
|
fis->device = 1 << 6;
|
|
fis->device = 1 << 6;
|
|
fis->features = nsect & 0xFF;
|
|
fis->features = nsect & 0xFF;
|
|
fis->features_ex = (nsect >> 8) & 0xFF;
|
|
fis->features_ex = (nsect >> 8) & 0xFF;
|