Re: Return of PENDING status to SCSI driver

Ramya Desai
2009-06-16T15:09:22Z

> > /* error and abort handlers */
> > .eh_abort_handler = command_abort,
> > .eh_device_reset_handler = device_reset,
> > .eh_bus_reset_handler = bus_reset,

Currently I have not implemented these functions. I will register a
transport handler for the above functions and use strategy handler for
error handling at later point of time.

Here is my queuecommand implementation. Please let me know if any
other part of the code is required to find the problem.

static int queuecommand(struct scsi_cmnd *srb,
void (*done)(struct scsi_cmnd *))
{
int res = 0;
struct uas_task *task;
struct us_data *us = host_to_us(srb->device->host);

US_DEBUG(usb_stor_show_command(srb));

/* check for state-transition errors */
if (us->srb != NULL) {
printk(KERN_ERR USB_STORAGE "Error in %s: us->srb = %p\n",
__func__, us->srb);
return SCSI_MLQUEUE_HOST_BUSY;
}

/* fail the command if we are disconnecting */
if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) {
US_DEBUGP("Fail command during disconnect\n");
srb->result = DID_NO_CONNECT << 16;
done(srb);
return 0;
}

/* Create one task per SCSI command */
task = uas_create_task(srb, us, GFP_ATOMIC);
if (!task)
return -ENOMEM;

/* enqueue the command and wake up the control thread */
srb->scsi_done = done;

//us->srb = srb; // eliminated, as a task has been created
per SCSI command

/* Queue the above created task */
res = uas_queue(task, us);

/* Examine */
if (res) {

//Checking the status of the queue
if (res == -UAS_QUEUE_FULL) {
srb->result = DID_SOFT_ERROR << 16; /* retry */
res = 0;
done(srb);
}
return res;
}

printk("MyTag: <%s> <%s> Exit!\n",__FILE__, __FUNCTION__);

return 0; //Returning 0 to get the next command
}
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html