diff options
Diffstat (limited to 'drivers/staging/keucr/scsiglue.c')
| -rw-r--r-- | drivers/staging/keucr/scsiglue.c | 229 |
1 files changed, 124 insertions, 105 deletions
diff --git a/drivers/staging/keucr/scsiglue.c b/drivers/staging/keucr/scsiglue.c index a2671404f7a..7d8d444910c 100644 --- a/drivers/staging/keucr/scsiglue.c +++ b/drivers/staging/keucr/scsiglue.c @@ -1,3 +1,5 @@ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + #include <linux/slab.h> #include <linux/module.h> #include <linux/mutex.h> @@ -13,19 +15,23 @@ #include "transport.h" /* Host functions */ -//----- host_info() --------------------- -static const char* host_info(struct Scsi_Host *host) +/* + * host_info() + */ +static const char *host_info(struct Scsi_Host *host) { - //printk("scsiglue --- host_info\n"); + /* pr_info("scsiglue --- host_info\n"); */ return "SCSI emulation for USB Mass Storage devices"; } -//----- slave_alloc() --------------------- +/* + * slave_alloc() + */ static int slave_alloc(struct scsi_device *sdev) { struct us_data *us = host_to_us(sdev->host); - //printk("scsiglue --- slave_alloc\n"); + /* pr_info("scsiglue --- slave_alloc\n"); */ sdev->inquiry_len = 36; blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1)); @@ -36,14 +42,15 @@ static int slave_alloc(struct scsi_device *sdev) return 0; } -//----- slave_configure() --------------------- +/* + * slave_configure() + */ static int slave_configure(struct scsi_device *sdev) { struct us_data *us = host_to_us(sdev->host); - //printk("scsiglue --- slave_configure\n"); - if (us->fflags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) - { + /* pr_info("scsiglue --- slave_configure\n"); */ + if (us->fflags & (US_FL_MAX_SECTORS_64 | US_FL_MAX_SECTORS_MIN)) { unsigned int max_sectors = 64; if (us->fflags & US_FL_MAX_SECTORS_MIN) @@ -53,9 +60,9 @@ static int slave_configure(struct scsi_device *sdev) max_sectors); } - if (sdev->type == TYPE_DISK) - { - if (us->subclass != USB_SC_SCSI && us->subclass != USB_SC_CYP_ATACB) + if (sdev->type == TYPE_DISK) { + if (us->subclass != USB_SC_SCSI && + us->subclass != USB_SC_CYP_ATACB) sdev->use_10_for_ms = 1; sdev->use_192_bytes_for_3f = 1; if (us->fflags & US_FL_NO_WP_DETECT) @@ -66,17 +73,17 @@ static int slave_configure(struct scsi_device *sdev) if (us->fflags & US_FL_CAPACITY_HEURISTICS) sdev->guess_capacity = 1; if (sdev->scsi_level > SCSI_2) - sdev->sdev_target->scsi_level = sdev->scsi_level = SCSI_2; + sdev->sdev_target->scsi_level = sdev->scsi_level + = SCSI_2; sdev->retry_hwerror = 1; sdev->allow_restart = 1; sdev->last_sector_bug = 1; - } - else - { + } else { sdev->use_10_for_ms = 1; } - if ((us->protocol == USB_PR_CB || us->protocol == USB_PR_CBI) && sdev->scsi_level == SCSI_UNKNOWN) + if ((us->protocol == USB_PR_CB || us->protocol == USB_PR_CBI) && + sdev->scsi_level == SCSI_UNKNOWN) us->max_lun = 0; if (us->fflags & US_FL_NOT_LOCKABLE) @@ -86,24 +93,26 @@ static int slave_configure(struct scsi_device *sdev) } /* This is always called with scsi_lock(host) held */ -//----- queuecommand() --------------------- -static int queuecommand(struct scsi_cmnd *srb, void (*done)(struct scsi_cmnd *)) +/* + * queuecommand() + */ +static int queuecommand_lck(struct scsi_cmnd *srb, + void (*done)(struct scsi_cmnd *)) { struct us_data *us = host_to_us(srb->device->host); - //printk("scsiglue --- queuecommand\n"); + /* pr_info("scsiglue --- queuecommand\n"); */ /* check for state-transition errors */ - if (us->srb != NULL) - { - printk("Error in %s: us->srb = %p\n", __FUNCTION__, us->srb); + if (us->srb != NULL) { + /* pr_info("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)) - { - printk("Fail command during disconnect\n"); + if (test_bit(US_FLIDX_DISCONNECTING, &us->dflags)) { + pr_info("Fail command during disconnect\n"); srb->result = DID_NO_CONNECT << 16; done(srb); return 0; @@ -117,29 +126,31 @@ static int queuecommand(struct scsi_cmnd *srb, void (*done)(struct scsi_cmnd *)) return 0; } +static DEF_SCSI_QCMD(queuecommand) + /*********************************************************************** * Error handling functions ***********************************************************************/ /* Command timeout and abort */ -//----- command_abort() --------------------- +/* + * command_abort() + */ static int command_abort(struct scsi_cmnd *srb) { struct us_data *us = host_to_us(srb->device->host); - //printk("scsiglue --- command_abort\n"); + /* pr_info("scsiglue --- command_abort\n"); */ scsi_lock(us_to_host(us)); - if (us->srb != srb) - { + if (us->srb != srb) { scsi_unlock(us_to_host(us)); - printk ("-- nothing to abort\n"); + dev_info(&us->pusb_dev->dev, "-- nothing to abort\n"); return FAILED; } set_bit(US_FLIDX_TIMED_OUT, &us->dflags); - if (!test_bit(US_FLIDX_RESETTING, &us->dflags)) - { + if (!test_bit(US_FLIDX_RESETTING, &us->dflags)) { set_bit(US_FLIDX_ABORTING, &us->dflags); usb_stor_stop_transport(us); } @@ -150,14 +161,18 @@ static int command_abort(struct scsi_cmnd *srb) return SUCCESS; } -/* This invokes the transport reset mechanism to reset the state of the device */ -//----- device_reset() --------------------- +/* This invokes the transport reset mechanism to reset the state of the + * device. + */ +/* + * device_reset() + */ static int device_reset(struct scsi_cmnd *srb) { struct us_data *us = host_to_us(srb->device->host); int result; - //printk("scsiglue --- device_reset\n"); + /* pr_info("scsiglue --- device_reset\n"); */ /* lock the device pointers and do the reset */ mutex_lock(&(us->dev_mutex)); @@ -167,38 +182,43 @@ static int device_reset(struct scsi_cmnd *srb) return result < 0 ? FAILED : SUCCESS; } -//----- bus_reset() --------------------- +/* + * bus_reset() + */ static int bus_reset(struct scsi_cmnd *srb) { struct us_data *us = host_to_us(srb->device->host); int result; - //printk("scsiglue --- bus_reset\n"); + /* pr_info("scsiglue --- bus_reset\n"); */ result = usb_stor_port_reset(us); return result < 0 ? FAILED : SUCCESS; } -//----- usb_stor_report_device_reset() --------------------- +/* + * usb_stor_report_device_reset() + */ void usb_stor_report_device_reset(struct us_data *us) { int i; struct Scsi_Host *host = us_to_host(us); - //printk("scsiglue --- usb_stor_report_device_reset\n"); + /* pr_info("scsiglue --- usb_stor_report_device_reset\n"); */ scsi_report_device_reset(host, 0, 0); - if (us->fflags & US_FL_SCM_MULT_TARG) - { + if (us->fflags & US_FL_SCM_MULT_TARG) { for (i = 1; i < host->max_id; ++i) scsi_report_device_reset(host, 0, i); } } -//----- usb_stor_report_bus_reset() --------------------- +/* + * usb_stor_report_bus_reset() + */ void usb_stor_report_bus_reset(struct us_data *us) { struct Scsi_Host *host = us_to_host(us); - //printk("scsiglue --- usb_stor_report_bus_reset\n"); + /* pr_info("scsiglue --- usb_stor_report_bus_reset\n"); */ scsi_lock(host); scsi_report_bus_reset(host, 0); scsi_unlock(host); @@ -210,20 +230,18 @@ void usb_stor_report_bus_reset(struct us_data *us) /* we use this macro to help us write into the buffer */ #undef SPRINTF -#define SPRINTF(args...) \ - do { if (pos < buffer+length) pos += sprintf(pos, ## args); } while (0) +#define SPRINTF(args...) seq_printf(m, ##args) -//----- proc_info() --------------------- -static int proc_info (struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int inout) +static int write_info(struct Scsi_Host *host, char *buffer, int length) +{ + return length; +} + +static int show_info(struct seq_file *m, struct Scsi_Host *host) { struct us_data *us = host_to_us(host); - char *pos = buffer; const char *string; - //printk("scsiglue --- proc_info\n"); - if (inout) - return length; - /* print the controller name */ SPRINTF(" Host scsi%d: usb-storage\n", host->host_no); @@ -253,27 +271,17 @@ static int proc_info (struct Scsi_Host *host, char *buffer, char **start, off_t SPRINTF(" Transport: %s\n", us->transport_name); /* show the device flags */ - if (pos < buffer + length) - { - pos += sprintf(pos, " Quirks:"); + SPRINTF(" Quirks:"); #define US_FLAG(name, value) \ - if (us->fflags & value) pos += sprintf(pos, " " #name); + do { \ + if (us->fflags & value) \ + SPRINTF(" " #name); \ + } while (0); US_DO_ALL_FLAGS #undef US_FLAG - - *(pos++) = '\n'; - } - - /* Calculate start of next buffer, and return value. */ - *start = buffer + offset; - - if ((pos - buffer) < offset) - return (0); - else if ((pos - buffer - offset) < length) - return (pos - buffer - offset); - else - return (length); + seq_putc(m, '\n'); + return 0; } /*********************************************************************** @@ -281,42 +289,47 @@ US_DO_ALL_FLAGS ***********************************************************************/ /* Output routine for the sysfs max_sectors file */ -//----- show_max_sectors() --------------------- -static ssize_t show_max_sectors(struct device *dev, struct device_attribute *attr, char *buf) +static ssize_t max_sectors_show(struct device *dev, + struct device_attribute *attr, char *buf) { struct scsi_device *sdev = to_scsi_device(dev); - //printk("scsiglue --- ssize_t show_max_sectors\n"); + /* pr_info("scsiglue --- ssize_t show_max_sectors\n"); */ return sprintf(buf, "%u\n", queue_max_sectors(sdev->request_queue)); } /* Input routine for the sysfs max_sectors file */ -//----- store_max_sectors() --------------------- -static ssize_t store_max_sectors(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +static ssize_t max_sectors_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { struct scsi_device *sdev = to_scsi_device(dev); unsigned short ms; - //printk("scsiglue --- ssize_t store_max_sectors\n"); - if (sscanf(buf, "%hu", &ms) > 0 && ms <= SCSI_DEFAULT_MAX_SECTORS) - { + /* pr_info("scsiglue --- ssize_t store_max_sectors\n"); */ + if (sscanf(buf, "%hu", &ms) > 0 && ms <= SCSI_DEFAULT_MAX_SECTORS) { blk_queue_max_hw_sectors(sdev->request_queue, ms); return strlen(buf); } - return -EINVAL; + return -EINVAL; } +static DEVICE_ATTR_RW(max_sectors); -static DEVICE_ATTR(max_sectors, S_IRUGO | S_IWUSR, show_max_sectors, store_max_sectors); -static struct device_attribute *sysfs_device_attr_list[] = {&dev_attr_max_sectors, NULL, }; +static struct device_attribute *sysfs_device_attr_list[] = { + &dev_attr_max_sectors, NULL, +}; /* this defines our host template, with which we'll allocate hosts */ -//----- usb_stor_host_template() --------------------- +/* + * usb_stor_host_template() + */ struct scsi_host_template usb_stor_host_template = { /* basic userland interface stuff */ .name = "eucr-storage", .proc_name = "eucr-storage", - .proc_info = proc_info, + .write_info = write_info, + .show_info = show_info, .info = host_info, /* command interface -- queued only */ @@ -374,42 +387,42 @@ unsigned char usb_stor_sense_invalidCDB[18] = { * Scatter-gather transfer buffer access routines ***********************************************************************/ -//----- usb_stor_access_xfer_buf() --------------------- -unsigned int usb_stor_access_xfer_buf(struct us_data *us, unsigned char *buffer, - unsigned int buflen, struct scsi_cmnd *srb, struct scatterlist **sgptr, +/* + * usb_stor_access_xfer_buf() + */ +unsigned int usb_stor_access_xfer_buf(struct us_data *us, + unsigned char *buffer, unsigned int buflen, + struct scsi_cmnd *srb, struct scatterlist **sgptr, unsigned int *offset, enum xfer_buf_dir dir) { unsigned int cnt; - //printk("transport --- usb_stor_access_xfer_buf\n"); + /* pr_info("transport --- usb_stor_access_xfer_buf\n"); */ struct scatterlist *sg = *sgptr; if (!sg) sg = scsi_sglist(srb); cnt = 0; - while (cnt < buflen && sg) - { - struct page *page = sg_page(sg) + ((sg->offset + *offset) >> PAGE_SHIFT); + while (cnt < buflen && sg) { + struct page *page = sg_page(sg) + + ((sg->offset + *offset) >> PAGE_SHIFT); unsigned int poff = (sg->offset + *offset) & (PAGE_SIZE-1); unsigned int sglen = sg->length - *offset; - if (sglen > buflen - cnt) - { + if (sglen > buflen - cnt) { /* Transfer ends within this s-g entry */ sglen = buflen - cnt; *offset += sglen; - } - else - { + } else { /* Transfer continues to next s-g entry */ *offset = 0; sg = sg_next(sg); } - while (sglen > 0) - { - unsigned int plen = min(sglen, (unsigned int)PAGE_SIZE - poff); + while (sglen > 0) { + unsigned int plen = min(sglen, + (unsigned int)PAGE_SIZE - poff); unsigned char *ptr = kmap(page); if (dir == TO_XFER_BUF) @@ -431,18 +444,24 @@ unsigned int usb_stor_access_xfer_buf(struct us_data *us, unsigned char *buffer, return cnt; } -/* Store the contents of buffer into srb's transfer buffer and set the SCSI residue. */ -//----- usb_stor_set_xfer_buf() --------------------- -void usb_stor_set_xfer_buf(struct us_data *us, unsigned char *buffer, unsigned int buflen, struct scsi_cmnd *srb, - unsigned int dir) +/* + * Store the contents of buffer into srb's transfer + * buffer and set the SCSI residue. + */ +/* + * usb_stor_set_xfer_buf() + */ +void usb_stor_set_xfer_buf(struct us_data *us, unsigned char *buffer, + unsigned int buflen, struct scsi_cmnd *srb, unsigned int dir) { unsigned int offset = 0; struct scatterlist *sg = NULL; - //printk("transport --- usb_stor_set_xfer_buf\n"); - // TO_XFER_BUF = 0, FROM_XFER_BUF = 1 + /* pr_info("transport --- usb_stor_set_xfer_buf\n"); */ + /* TO_XFER_BUF = 0, FROM_XFER_BUF = 1 */ buflen = min(buflen, scsi_bufflen(srb)); - buflen = usb_stor_access_xfer_buf(us, buffer, buflen, srb, &sg, &offset, dir); + buflen = usb_stor_access_xfer_buf(us, buffer, buflen, srb, + &sg, &offset, dir); if (buflen < scsi_bufflen(srb)) scsi_set_resid(srb, scsi_bufflen(srb) - buflen); } |
