linux/drivers/usb/storage/uas.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * USB Attached SCSI
   4 * Note that this is not the same as the USB Mass Storage driver
   5 *
   6 * Copyright Hans de Goede <hdegoede@redhat.com> for Red Hat, Inc. 2013 - 2016
   7 * Copyright Matthew Wilcox for Intel Corp, 2010
   8 * Copyright Sarah Sharp for Intel Corp, 2010
   9 */
  10
  11#include <linux/blkdev.h>
  12#include <linux/slab.h>
  13#include <linux/types.h>
  14#include <linux/module.h>
  15#include <linux/usb.h>
  16#include <linux/usb_usual.h>
  17#include <linux/usb/hcd.h>
  18#include <linux/usb/storage.h>
  19#include <linux/usb/uas.h>
  20
  21#include <scsi/scsi.h>
  22#include <scsi/scsi_eh.h>
  23#include <scsi/scsi_dbg.h>
  24#include <scsi/scsi_cmnd.h>
  25#include <scsi/scsi_device.h>
  26#include <scsi/scsi_host.h>
  27#include <scsi/scsi_tcq.h>
  28
  29#include "uas-detect.h"
  30#include "scsiglue.h"
  31
  32#define MAX_CMNDS 256
  33
  34struct uas_dev_info {
  35        struct usb_interface *intf;
  36        struct usb_device *udev;
  37        struct usb_anchor cmd_urbs;
  38        struct usb_anchor sense_urbs;
  39        struct usb_anchor data_urbs;
  40        unsigned long flags;
  41        int qdepth, resetting;
  42        unsigned cmd_pipe, status_pipe, data_in_pipe, data_out_pipe;
  43        unsigned use_streams:1;
  44        unsigned shutdown:1;
  45        struct scsi_cmnd *cmnd[MAX_CMNDS];
  46        spinlock_t lock;
  47        struct work_struct work;
  48};
  49
  50enum {
  51        SUBMIT_STATUS_URB       = BIT(1),
  52        ALLOC_DATA_IN_URB       = BIT(2),
  53        SUBMIT_DATA_IN_URB      = BIT(3),
  54        ALLOC_DATA_OUT_URB      = BIT(4),
  55        SUBMIT_DATA_OUT_URB     = BIT(5),
  56        ALLOC_CMD_URB           = BIT(6),
  57        SUBMIT_CMD_URB          = BIT(7),
  58        COMMAND_INFLIGHT        = BIT(8),
  59        DATA_IN_URB_INFLIGHT    = BIT(9),
  60        DATA_OUT_URB_INFLIGHT   = BIT(10),
  61        COMMAND_ABORTED         = BIT(11),
  62        IS_IN_WORK_LIST         = BIT(12),
  63};
  64
  65/* Overrides scsi_pointer */
  66struct uas_cmd_info {
  67        unsigned int state;
  68        unsigned int uas_tag;
  69        struct urb *cmd_urb;
  70        struct urb *data_in_urb;
  71        struct urb *data_out_urb;
  72};
  73
  74/* I hate forward declarations, but I actually have a loop */
  75static int uas_submit_urbs(struct scsi_cmnd *cmnd,
  76                                struct uas_dev_info *devinfo);
  77static void uas_do_work(struct work_struct *work);
  78static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller);
  79static void uas_free_streams(struct uas_dev_info *devinfo);
  80static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *prefix,
  81                                int status);
  82
  83static void uas_do_work(struct work_struct *work)
  84{
  85        struct uas_dev_info *devinfo =
  86                container_of(work, struct uas_dev_info, work);
  87        struct uas_cmd_info *cmdinfo;
  88        struct scsi_cmnd *cmnd;
  89        unsigned long flags;
  90        int i, err;
  91
  92        spin_lock_irqsave(&devinfo->lock, flags);
  93
  94        if (devinfo->resetting)
  95                goto out;
  96
  97        for (i = 0; i < devinfo->qdepth; i++) {
  98                if (!devinfo->cmnd[i])
  99                        continue;
 100
 101                cmnd = devinfo->cmnd[i];
 102                cmdinfo = (void *)&cmnd->SCp;
 103
 104                if (!(cmdinfo->state & IS_IN_WORK_LIST))
 105                        continue;
 106
 107                err = uas_submit_urbs(cmnd, cmnd->device->hostdata);
 108                if (!err)
 109                        cmdinfo->state &= ~IS_IN_WORK_LIST;
 110                else
 111                        schedule_work(&devinfo->work);
 112        }
 113out:
 114        spin_unlock_irqrestore(&devinfo->lock, flags);
 115}
 116
 117static void uas_add_work(struct uas_cmd_info *cmdinfo)
 118{
 119        struct scsi_pointer *scp = (void *)cmdinfo;
 120        struct scsi_cmnd *cmnd = container_of(scp, struct scsi_cmnd, SCp);
 121        struct uas_dev_info *devinfo = cmnd->device->hostdata;
 122
 123        lockdep_assert_held(&devinfo->lock);
 124        cmdinfo->state |= IS_IN_WORK_LIST;
 125        schedule_work(&devinfo->work);
 126}
 127
 128static void uas_zap_pending(struct uas_dev_info *devinfo, int result)
 129{
 130        struct uas_cmd_info *cmdinfo;
 131        struct scsi_cmnd *cmnd;
 132        unsigned long flags;
 133        int i, err;
 134
 135        spin_lock_irqsave(&devinfo->lock, flags);
 136        for (i = 0; i < devinfo->qdepth; i++) {
 137                if (!devinfo->cmnd[i])
 138                        continue;
 139
 140                cmnd = devinfo->cmnd[i];
 141                cmdinfo = (void *)&cmnd->SCp;
 142                uas_log_cmd_state(cmnd, __func__, 0);
 143                /* Sense urbs were killed, clear COMMAND_INFLIGHT manually */
 144                cmdinfo->state &= ~COMMAND_INFLIGHT;
 145                cmnd->result = result << 16;
 146                err = uas_try_complete(cmnd, __func__);
 147                WARN_ON(err != 0);
 148        }
 149        spin_unlock_irqrestore(&devinfo->lock, flags);
 150}
 151
 152static void uas_sense(struct urb *urb, struct scsi_cmnd *cmnd)
 153{
 154        struct sense_iu *sense_iu = urb->transfer_buffer;
 155        struct scsi_device *sdev = cmnd->device;
 156
 157        if (urb->actual_length > 16) {
 158                unsigned len = be16_to_cpup(&sense_iu->len);
 159                if (len + 16 != urb->actual_length) {
 160                        int newlen = min(len + 16, urb->actual_length) - 16;
 161                        if (newlen < 0)
 162                                newlen = 0;
 163                        sdev_printk(KERN_INFO, sdev, "%s: urb length %d "
 164                                "disagrees with IU sense data length %d, "
 165                                "using %d bytes of sense data\n", __func__,
 166                                        urb->actual_length, len, newlen);
 167                        len = newlen;
 168                }
 169                memcpy(cmnd->sense_buffer, sense_iu->sense, len);
 170        }
 171
 172        cmnd->result = sense_iu->status;
 173}
 174
 175static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *prefix,
 176                              int status)
 177{
 178        struct uas_cmd_info *ci = (void *)&cmnd->SCp;
 179        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 180
 181        scmd_printk(KERN_INFO, cmnd,
 182                    "%s %d uas-tag %d inflight:%s%s%s%s%s%s%s%s%s%s%s%s ",
 183                    prefix, status, cmdinfo->uas_tag,
 184                    (ci->state & SUBMIT_STATUS_URB)     ? " s-st"  : "",
 185                    (ci->state & ALLOC_DATA_IN_URB)     ? " a-in"  : "",
 186                    (ci->state & SUBMIT_DATA_IN_URB)    ? " s-in"  : "",
 187                    (ci->state & ALLOC_DATA_OUT_URB)    ? " a-out" : "",
 188                    (ci->state & SUBMIT_DATA_OUT_URB)   ? " s-out" : "",
 189                    (ci->state & ALLOC_CMD_URB)         ? " a-cmd" : "",
 190                    (ci->state & SUBMIT_CMD_URB)        ? " s-cmd" : "",
 191                    (ci->state & COMMAND_INFLIGHT)      ? " CMD"   : "",
 192                    (ci->state & DATA_IN_URB_INFLIGHT)  ? " IN"    : "",
 193                    (ci->state & DATA_OUT_URB_INFLIGHT) ? " OUT"   : "",
 194                    (ci->state & COMMAND_ABORTED)       ? " abort" : "",
 195                    (ci->state & IS_IN_WORK_LIST)       ? " work"  : "");
 196        scsi_print_command(cmnd);
 197}
 198
 199static void uas_free_unsubmitted_urbs(struct scsi_cmnd *cmnd)
 200{
 201        struct uas_cmd_info *cmdinfo;
 202
 203        if (!cmnd)
 204                return;
 205
 206        cmdinfo = (void *)&cmnd->SCp;
 207
 208        if (cmdinfo->state & SUBMIT_CMD_URB)
 209                usb_free_urb(cmdinfo->cmd_urb);
 210
 211        /* data urbs may have never gotten their submit flag set */
 212        if (!(cmdinfo->state & DATA_IN_URB_INFLIGHT))
 213                usb_free_urb(cmdinfo->data_in_urb);
 214        if (!(cmdinfo->state & DATA_OUT_URB_INFLIGHT))
 215                usb_free_urb(cmdinfo->data_out_urb);
 216}
 217
 218static int uas_try_complete(struct scsi_cmnd *cmnd, const char *caller)
 219{
 220        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 221        struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
 222
 223        lockdep_assert_held(&devinfo->lock);
 224        if (cmdinfo->state & (COMMAND_INFLIGHT |
 225                              DATA_IN_URB_INFLIGHT |
 226                              DATA_OUT_URB_INFLIGHT |
 227                              COMMAND_ABORTED))
 228                return -EBUSY;
 229        devinfo->cmnd[cmdinfo->uas_tag - 1] = NULL;
 230        uas_free_unsubmitted_urbs(cmnd);
 231        cmnd->scsi_done(cmnd);
 232        return 0;
 233}
 234
 235static void uas_xfer_data(struct urb *urb, struct scsi_cmnd *cmnd,
 236                          unsigned direction)
 237{
 238        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 239        int err;
 240
 241        cmdinfo->state |= direction | SUBMIT_STATUS_URB;
 242        err = uas_submit_urbs(cmnd, cmnd->device->hostdata);
 243        if (err) {
 244                uas_add_work(cmdinfo);
 245        }
 246}
 247
 248static bool uas_evaluate_response_iu(struct response_iu *riu, struct scsi_cmnd *cmnd)
 249{
 250        u8 response_code = riu->response_code;
 251
 252        switch (response_code) {
 253        case RC_INCORRECT_LUN:
 254                cmnd->result = DID_BAD_TARGET << 16;
 255                break;
 256        case RC_TMF_SUCCEEDED:
 257                cmnd->result = DID_OK << 16;
 258                break;
 259        case RC_TMF_NOT_SUPPORTED:
 260                cmnd->result = DID_TARGET_FAILURE << 16;
 261                break;
 262        default:
 263                uas_log_cmd_state(cmnd, "response iu", response_code);
 264                cmnd->result = DID_ERROR << 16;
 265                break;
 266        }
 267
 268        return response_code == RC_TMF_SUCCEEDED;
 269}
 270
 271static void uas_stat_cmplt(struct urb *urb)
 272{
 273        struct iu *iu = urb->transfer_buffer;
 274        struct Scsi_Host *shost = urb->context;
 275        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
 276        struct urb *data_in_urb = NULL;
 277        struct urb *data_out_urb = NULL;
 278        struct scsi_cmnd *cmnd;
 279        struct uas_cmd_info *cmdinfo;
 280        unsigned long flags;
 281        unsigned int idx;
 282        int status = urb->status;
 283        bool success;
 284
 285        spin_lock_irqsave(&devinfo->lock, flags);
 286
 287        if (devinfo->resetting)
 288                goto out;
 289
 290        if (status) {
 291                if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN)
 292                        dev_err(&urb->dev->dev, "stat urb: status %d\n", status);
 293                goto out;
 294        }
 295
 296        idx = be16_to_cpup(&iu->tag) - 1;
 297        if (idx >= MAX_CMNDS || !devinfo->cmnd[idx]) {
 298                dev_err(&urb->dev->dev,
 299                        "stat urb: no pending cmd for uas-tag %d\n", idx + 1);
 300                goto out;
 301        }
 302
 303        cmnd = devinfo->cmnd[idx];
 304        cmdinfo = (void *)&cmnd->SCp;
 305
 306        if (!(cmdinfo->state & COMMAND_INFLIGHT)) {
 307                uas_log_cmd_state(cmnd, "unexpected status cmplt", 0);
 308                goto out;
 309        }
 310
 311        switch (iu->iu_id) {
 312        case IU_ID_STATUS:
 313                uas_sense(urb, cmnd);
 314                if (cmnd->result != 0) {
 315                        /* cancel data transfers on error */
 316                        data_in_urb = usb_get_urb(cmdinfo->data_in_urb);
 317                        data_out_urb = usb_get_urb(cmdinfo->data_out_urb);
 318                }
 319                cmdinfo->state &= ~COMMAND_INFLIGHT;
 320                uas_try_complete(cmnd, __func__);
 321                break;
 322        case IU_ID_READ_READY:
 323                if (!cmdinfo->data_in_urb ||
 324                                (cmdinfo->state & DATA_IN_URB_INFLIGHT)) {
 325                        uas_log_cmd_state(cmnd, "unexpected read rdy", 0);
 326                        break;
 327                }
 328                uas_xfer_data(urb, cmnd, SUBMIT_DATA_IN_URB);
 329                break;
 330        case IU_ID_WRITE_READY:
 331                if (!cmdinfo->data_out_urb ||
 332                                (cmdinfo->state & DATA_OUT_URB_INFLIGHT)) {
 333                        uas_log_cmd_state(cmnd, "unexpected write rdy", 0);
 334                        break;
 335                }
 336                uas_xfer_data(urb, cmnd, SUBMIT_DATA_OUT_URB);
 337                break;
 338        case IU_ID_RESPONSE:
 339                cmdinfo->state &= ~COMMAND_INFLIGHT;
 340                success = uas_evaluate_response_iu((struct response_iu *)iu, cmnd);
 341                if (!success) {
 342                        /* Error, cancel data transfers */
 343                        data_in_urb = usb_get_urb(cmdinfo->data_in_urb);
 344                        data_out_urb = usb_get_urb(cmdinfo->data_out_urb);
 345                }
 346                uas_try_complete(cmnd, __func__);
 347                break;
 348        default:
 349                uas_log_cmd_state(cmnd, "bogus IU", iu->iu_id);
 350        }
 351out:
 352        usb_free_urb(urb);
 353        spin_unlock_irqrestore(&devinfo->lock, flags);
 354
 355        /* Unlinking of data urbs must be done without holding the lock */
 356        if (data_in_urb) {
 357                usb_unlink_urb(data_in_urb);
 358                usb_put_urb(data_in_urb);
 359        }
 360        if (data_out_urb) {
 361                usb_unlink_urb(data_out_urb);
 362                usb_put_urb(data_out_urb);
 363        }
 364}
 365
 366static void uas_data_cmplt(struct urb *urb)
 367{
 368        struct scsi_cmnd *cmnd = urb->context;
 369        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 370        struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
 371        struct scsi_data_buffer *sdb = &cmnd->sdb;
 372        unsigned long flags;
 373        int status = urb->status;
 374
 375        spin_lock_irqsave(&devinfo->lock, flags);
 376
 377        if (cmdinfo->data_in_urb == urb) {
 378                cmdinfo->state &= ~DATA_IN_URB_INFLIGHT;
 379                cmdinfo->data_in_urb = NULL;
 380        } else if (cmdinfo->data_out_urb == urb) {
 381                cmdinfo->state &= ~DATA_OUT_URB_INFLIGHT;
 382                cmdinfo->data_out_urb = NULL;
 383        }
 384
 385        if (devinfo->resetting)
 386                goto out;
 387
 388        /* Data urbs should not complete before the cmd urb is submitted */
 389        if (cmdinfo->state & SUBMIT_CMD_URB) {
 390                uas_log_cmd_state(cmnd, "unexpected data cmplt", 0);
 391                goto out;
 392        }
 393
 394        if (status) {
 395                if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN)
 396                        uas_log_cmd_state(cmnd, "data cmplt err", status);
 397                /* error: no data transfered */
 398                scsi_set_resid(cmnd, sdb->length);
 399        } else {
 400                scsi_set_resid(cmnd, sdb->length - urb->actual_length);
 401        }
 402        uas_try_complete(cmnd, __func__);
 403out:
 404        usb_free_urb(urb);
 405        spin_unlock_irqrestore(&devinfo->lock, flags);
 406}
 407
 408static void uas_cmd_cmplt(struct urb *urb)
 409{
 410        if (urb->status)
 411                dev_err(&urb->dev->dev, "cmd cmplt err %d\n", urb->status);
 412
 413        usb_free_urb(urb);
 414}
 415
 416static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp,
 417                                      struct scsi_cmnd *cmnd,
 418                                      enum dma_data_direction dir)
 419{
 420        struct usb_device *udev = devinfo->udev;
 421        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 422        struct urb *urb = usb_alloc_urb(0, gfp);
 423        struct scsi_data_buffer *sdb = &cmnd->sdb;
 424        unsigned int pipe = (dir == DMA_FROM_DEVICE)
 425                ? devinfo->data_in_pipe : devinfo->data_out_pipe;
 426
 427        if (!urb)
 428                goto out;
 429        usb_fill_bulk_urb(urb, udev, pipe, NULL, sdb->length,
 430                          uas_data_cmplt, cmnd);
 431        if (devinfo->use_streams)
 432                urb->stream_id = cmdinfo->uas_tag;
 433        urb->num_sgs = udev->bus->sg_tablesize ? sdb->table.nents : 0;
 434        urb->sg = sdb->table.sgl;
 435 out:
 436        return urb;
 437}
 438
 439static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp,
 440                                       struct scsi_cmnd *cmnd)
 441{
 442        struct usb_device *udev = devinfo->udev;
 443        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 444        struct urb *urb = usb_alloc_urb(0, gfp);
 445        struct sense_iu *iu;
 446
 447        if (!urb)
 448                goto out;
 449
 450        iu = kzalloc(sizeof(*iu), gfp);
 451        if (!iu)
 452                goto free;
 453
 454        usb_fill_bulk_urb(urb, udev, devinfo->status_pipe, iu, sizeof(*iu),
 455                          uas_stat_cmplt, cmnd->device->host);
 456        if (devinfo->use_streams)
 457                urb->stream_id = cmdinfo->uas_tag;
 458        urb->transfer_flags |= URB_FREE_BUFFER;
 459 out:
 460        return urb;
 461 free:
 462        usb_free_urb(urb);
 463        return NULL;
 464}
 465
 466static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp,
 467                                        struct scsi_cmnd *cmnd)
 468{
 469        struct usb_device *udev = devinfo->udev;
 470        struct scsi_device *sdev = cmnd->device;
 471        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 472        struct urb *urb = usb_alloc_urb(0, gfp);
 473        struct command_iu *iu;
 474        int len;
 475
 476        if (!urb)
 477                goto out;
 478
 479        len = cmnd->cmd_len - 16;
 480        if (len < 0)
 481                len = 0;
 482        len = ALIGN(len, 4);
 483        iu = kzalloc(sizeof(*iu) + len, gfp);
 484        if (!iu)
 485                goto free;
 486
 487        iu->iu_id = IU_ID_COMMAND;
 488        iu->tag = cpu_to_be16(cmdinfo->uas_tag);
 489        iu->prio_attr = UAS_SIMPLE_TAG;
 490        iu->len = len;
 491        int_to_scsilun(sdev->lun, &iu->lun);
 492        memcpy(iu->cdb, cmnd->cmnd, cmnd->cmd_len);
 493
 494        usb_fill_bulk_urb(urb, udev, devinfo->cmd_pipe, iu, sizeof(*iu) + len,
 495                                                        uas_cmd_cmplt, NULL);
 496        urb->transfer_flags |= URB_FREE_BUFFER;
 497 out:
 498        return urb;
 499 free:
 500        usb_free_urb(urb);
 501        return NULL;
 502}
 503
 504/*
 505 * Why should I request the Status IU before sending the Command IU?  Spec
 506 * says to, but also says the device may receive them in any order.  Seems
 507 * daft to me.
 508 */
 509
 510static struct urb *uas_submit_sense_urb(struct scsi_cmnd *cmnd, gfp_t gfp)
 511{
 512        struct uas_dev_info *devinfo = cmnd->device->hostdata;
 513        struct urb *urb;
 514        int err;
 515
 516        urb = uas_alloc_sense_urb(devinfo, gfp, cmnd);
 517        if (!urb)
 518                return NULL;
 519        usb_anchor_urb(urb, &devinfo->sense_urbs);
 520        err = usb_submit_urb(urb, gfp);
 521        if (err) {
 522                usb_unanchor_urb(urb);
 523                uas_log_cmd_state(cmnd, "sense submit err", err);
 524                usb_free_urb(urb);
 525                return NULL;
 526        }
 527        return urb;
 528}
 529
 530static int uas_submit_urbs(struct scsi_cmnd *cmnd,
 531                           struct uas_dev_info *devinfo)
 532{
 533        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 534        struct urb *urb;
 535        int err;
 536
 537        lockdep_assert_held(&devinfo->lock);
 538        if (cmdinfo->state & SUBMIT_STATUS_URB) {
 539                urb = uas_submit_sense_urb(cmnd, GFP_ATOMIC);
 540                if (!urb)
 541                        return SCSI_MLQUEUE_DEVICE_BUSY;
 542                cmdinfo->state &= ~SUBMIT_STATUS_URB;
 543        }
 544
 545        if (cmdinfo->state & ALLOC_DATA_IN_URB) {
 546                cmdinfo->data_in_urb = uas_alloc_data_urb(devinfo, GFP_ATOMIC,
 547                                                        cmnd, DMA_FROM_DEVICE);
 548                if (!cmdinfo->data_in_urb)
 549                        return SCSI_MLQUEUE_DEVICE_BUSY;
 550                cmdinfo->state &= ~ALLOC_DATA_IN_URB;
 551        }
 552
 553        if (cmdinfo->state & SUBMIT_DATA_IN_URB) {
 554                usb_anchor_urb(cmdinfo->data_in_urb, &devinfo->data_urbs);
 555                err = usb_submit_urb(cmdinfo->data_in_urb, GFP_ATOMIC);
 556                if (err) {
 557                        usb_unanchor_urb(cmdinfo->data_in_urb);
 558                        uas_log_cmd_state(cmnd, "data in submit err", err);
 559                        return SCSI_MLQUEUE_DEVICE_BUSY;
 560                }
 561                cmdinfo->state &= ~SUBMIT_DATA_IN_URB;
 562                cmdinfo->state |= DATA_IN_URB_INFLIGHT;
 563        }
 564
 565        if (cmdinfo->state & ALLOC_DATA_OUT_URB) {
 566                cmdinfo->data_out_urb = uas_alloc_data_urb(devinfo, GFP_ATOMIC,
 567                                                        cmnd, DMA_TO_DEVICE);
 568                if (!cmdinfo->data_out_urb)
 569                        return SCSI_MLQUEUE_DEVICE_BUSY;
 570                cmdinfo->state &= ~ALLOC_DATA_OUT_URB;
 571        }
 572
 573        if (cmdinfo->state & SUBMIT_DATA_OUT_URB) {
 574                usb_anchor_urb(cmdinfo->data_out_urb, &devinfo->data_urbs);
 575                err = usb_submit_urb(cmdinfo->data_out_urb, GFP_ATOMIC);
 576                if (err) {
 577                        usb_unanchor_urb(cmdinfo->data_out_urb);
 578                        uas_log_cmd_state(cmnd, "data out submit err", err);
 579                        return SCSI_MLQUEUE_DEVICE_BUSY;
 580                }
 581                cmdinfo->state &= ~SUBMIT_DATA_OUT_URB;
 582                cmdinfo->state |= DATA_OUT_URB_INFLIGHT;
 583        }
 584
 585        if (cmdinfo->state & ALLOC_CMD_URB) {
 586                cmdinfo->cmd_urb = uas_alloc_cmd_urb(devinfo, GFP_ATOMIC, cmnd);
 587                if (!cmdinfo->cmd_urb)
 588                        return SCSI_MLQUEUE_DEVICE_BUSY;
 589                cmdinfo->state &= ~ALLOC_CMD_URB;
 590        }
 591
 592        if (cmdinfo->state & SUBMIT_CMD_URB) {
 593                usb_anchor_urb(cmdinfo->cmd_urb, &devinfo->cmd_urbs);
 594                err = usb_submit_urb(cmdinfo->cmd_urb, GFP_ATOMIC);
 595                if (err) {
 596                        usb_unanchor_urb(cmdinfo->cmd_urb);
 597                        uas_log_cmd_state(cmnd, "cmd submit err", err);
 598                        return SCSI_MLQUEUE_DEVICE_BUSY;
 599                }
 600                cmdinfo->cmd_urb = NULL;
 601                cmdinfo->state &= ~SUBMIT_CMD_URB;
 602                cmdinfo->state |= COMMAND_INFLIGHT;
 603        }
 604
 605        return 0;
 606}
 607
 608static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
 609                                        void (*done)(struct scsi_cmnd *))
 610{
 611        struct scsi_device *sdev = cmnd->device;
 612        struct uas_dev_info *devinfo = sdev->hostdata;
 613        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 614        unsigned long flags;
 615        int idx, err;
 616
 617        BUILD_BUG_ON(sizeof(struct uas_cmd_info) > sizeof(struct scsi_pointer));
 618
 619        /* Re-check scsi_block_requests now that we've the host-lock */
 620        if (cmnd->device->host->host_self_blocked)
 621                return SCSI_MLQUEUE_DEVICE_BUSY;
 622
 623        if ((devinfo->flags & US_FL_NO_ATA_1X) &&
 624                        (cmnd->cmnd[0] == ATA_12 || cmnd->cmnd[0] == ATA_16)) {
 625                memcpy(cmnd->sense_buffer, usb_stor_sense_invalidCDB,
 626                       sizeof(usb_stor_sense_invalidCDB));
 627                cmnd->result = SAM_STAT_CHECK_CONDITION;
 628                cmnd->scsi_done(cmnd);
 629                return 0;
 630        }
 631
 632        spin_lock_irqsave(&devinfo->lock, flags);
 633
 634        if (devinfo->resetting) {
 635                cmnd->result = DID_ERROR << 16;
 636                cmnd->scsi_done(cmnd);
 637                spin_unlock_irqrestore(&devinfo->lock, flags);
 638                return 0;
 639        }
 640
 641        /* Find a free uas-tag */
 642        for (idx = 0; idx < devinfo->qdepth; idx++) {
 643                if (!devinfo->cmnd[idx])
 644                        break;
 645        }
 646        if (idx == devinfo->qdepth) {
 647                spin_unlock_irqrestore(&devinfo->lock, flags);
 648                return SCSI_MLQUEUE_DEVICE_BUSY;
 649        }
 650
 651        cmnd->scsi_done = done;
 652
 653        memset(cmdinfo, 0, sizeof(*cmdinfo));
 654        cmdinfo->uas_tag = idx + 1; /* uas-tag == usb-stream-id, so 1 based */
 655        cmdinfo->state = SUBMIT_STATUS_URB | ALLOC_CMD_URB | SUBMIT_CMD_URB;
 656
 657        switch (cmnd->sc_data_direction) {
 658        case DMA_FROM_DEVICE:
 659                cmdinfo->state |= ALLOC_DATA_IN_URB | SUBMIT_DATA_IN_URB;
 660                break;
 661        case DMA_BIDIRECTIONAL:
 662                cmdinfo->state |= ALLOC_DATA_IN_URB | SUBMIT_DATA_IN_URB;
 663                /* fall through */
 664        case DMA_TO_DEVICE:
 665                cmdinfo->state |= ALLOC_DATA_OUT_URB | SUBMIT_DATA_OUT_URB;
 666        case DMA_NONE:
 667                break;
 668        }
 669
 670        if (!devinfo->use_streams)
 671                cmdinfo->state &= ~(SUBMIT_DATA_IN_URB | SUBMIT_DATA_OUT_URB);
 672
 673        err = uas_submit_urbs(cmnd, devinfo);
 674        if (err) {
 675                /* If we did nothing, give up now */
 676                if (cmdinfo->state & SUBMIT_STATUS_URB) {
 677                        spin_unlock_irqrestore(&devinfo->lock, flags);
 678                        return SCSI_MLQUEUE_DEVICE_BUSY;
 679                }
 680                uas_add_work(cmdinfo);
 681        }
 682
 683        devinfo->cmnd[idx] = cmnd;
 684        spin_unlock_irqrestore(&devinfo->lock, flags);
 685        return 0;
 686}
 687
 688static DEF_SCSI_QCMD(uas_queuecommand)
 689
 690/*
 691 * For now we do not support actually sending an abort to the device, so
 692 * this eh always fails. Still we must define it to make sure that we've
 693 * dropped all references to the cmnd in question once this function exits.
 694 */
 695static int uas_eh_abort_handler(struct scsi_cmnd *cmnd)
 696{
 697        struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
 698        struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
 699        struct urb *data_in_urb = NULL;
 700        struct urb *data_out_urb = NULL;
 701        unsigned long flags;
 702
 703        spin_lock_irqsave(&devinfo->lock, flags);
 704
 705        uas_log_cmd_state(cmnd, __func__, 0);
 706
 707        /* Ensure that try_complete does not call scsi_done */
 708        cmdinfo->state |= COMMAND_ABORTED;
 709
 710        /* Drop all refs to this cmnd, kill data urbs to break their ref */
 711        devinfo->cmnd[cmdinfo->uas_tag - 1] = NULL;
 712        if (cmdinfo->state & DATA_IN_URB_INFLIGHT)
 713                data_in_urb = usb_get_urb(cmdinfo->data_in_urb);
 714        if (cmdinfo->state & DATA_OUT_URB_INFLIGHT)
 715                data_out_urb = usb_get_urb(cmdinfo->data_out_urb);
 716
 717        uas_free_unsubmitted_urbs(cmnd);
 718
 719        spin_unlock_irqrestore(&devinfo->lock, flags);
 720
 721        if (data_in_urb) {
 722                usb_kill_urb(data_in_urb);
 723                usb_put_urb(data_in_urb);
 724        }
 725        if (data_out_urb) {
 726                usb_kill_urb(data_out_urb);
 727                usb_put_urb(data_out_urb);
 728        }
 729
 730        return FAILED;
 731}
 732
 733static int uas_eh_device_reset_handler(struct scsi_cmnd *cmnd)
 734{
 735        struct scsi_device *sdev = cmnd->device;
 736        struct uas_dev_info *devinfo = sdev->hostdata;
 737        struct usb_device *udev = devinfo->udev;
 738        unsigned long flags;
 739        int err;
 740
 741        err = usb_lock_device_for_reset(udev, devinfo->intf);
 742        if (err) {
 743                shost_printk(KERN_ERR, sdev->host,
 744                             "%s FAILED to get lock err %d\n", __func__, err);
 745                return FAILED;
 746        }
 747
 748        shost_printk(KERN_INFO, sdev->host, "%s start\n", __func__);
 749
 750        spin_lock_irqsave(&devinfo->lock, flags);
 751        devinfo->resetting = 1;
 752        spin_unlock_irqrestore(&devinfo->lock, flags);
 753
 754        usb_kill_anchored_urbs(&devinfo->cmd_urbs);
 755        usb_kill_anchored_urbs(&devinfo->sense_urbs);
 756        usb_kill_anchored_urbs(&devinfo->data_urbs);
 757        uas_zap_pending(devinfo, DID_RESET);
 758
 759        err = usb_reset_device(udev);
 760
 761        spin_lock_irqsave(&devinfo->lock, flags);
 762        devinfo->resetting = 0;
 763        spin_unlock_irqrestore(&devinfo->lock, flags);
 764
 765        usb_unlock_device(udev);
 766
 767        if (err) {
 768                shost_printk(KERN_INFO, sdev->host, "%s FAILED err %d\n",
 769                             __func__, err);
 770                return FAILED;
 771        }
 772
 773        shost_printk(KERN_INFO, sdev->host, "%s success\n", __func__);
 774        return SUCCESS;
 775}
 776
 777static int uas_target_alloc(struct scsi_target *starget)
 778{
 779        struct uas_dev_info *devinfo = (struct uas_dev_info *)
 780                        dev_to_shost(starget->dev.parent)->hostdata;
 781
 782        if (devinfo->flags & US_FL_NO_REPORT_LUNS)
 783                starget->no_report_luns = 1;
 784
 785        return 0;
 786}
 787
 788static int uas_slave_alloc(struct scsi_device *sdev)
 789{
 790        struct uas_dev_info *devinfo =
 791                (struct uas_dev_info *)sdev->host->hostdata;
 792
 793        sdev->hostdata = devinfo;
 794
 795        /*
 796         * The protocol has no requirements on alignment in the strict sense.
 797         * Controllers may or may not have alignment restrictions.
 798         * As this is not exported, we use an extremely conservative guess.
 799         */
 800        blk_queue_update_dma_alignment(sdev->request_queue, (512 - 1));
 801
 802        if (devinfo->flags & US_FL_MAX_SECTORS_64)
 803                blk_queue_max_hw_sectors(sdev->request_queue, 64);
 804        else if (devinfo->flags & US_FL_MAX_SECTORS_240)
 805                blk_queue_max_hw_sectors(sdev->request_queue, 240);
 806
 807        return 0;
 808}
 809
 810static int uas_slave_configure(struct scsi_device *sdev)
 811{
 812        struct uas_dev_info *devinfo = sdev->hostdata;
 813
 814        if (devinfo->flags & US_FL_NO_REPORT_OPCODES)
 815                sdev->no_report_opcodes = 1;
 816
 817        /* A few buggy USB-ATA bridges don't understand FUA */
 818        if (devinfo->flags & US_FL_BROKEN_FUA)
 819                sdev->broken_fua = 1;
 820
 821        /* UAS also needs to support FL_ALWAYS_SYNC */
 822        if (devinfo->flags & US_FL_ALWAYS_SYNC) {
 823                sdev->skip_ms_page_3f = 1;
 824                sdev->skip_ms_page_8 = 1;
 825                sdev->wce_default_on = 1;
 826        }
 827
 828        /* Some disks cannot handle READ_CAPACITY_16 */
 829        if (devinfo->flags & US_FL_NO_READ_CAPACITY_16)
 830                sdev->no_read_capacity_16 = 1;
 831
 832        /*
 833         * Some disks return the total number of blocks in response
 834         * to READ CAPACITY rather than the highest block number.
 835         * If this device makes that mistake, tell the sd driver.
 836         */
 837        if (devinfo->flags & US_FL_FIX_CAPACITY)
 838                sdev->fix_capacity = 1;
 839
 840        /*
 841         * in some cases we have to guess
 842         */
 843        if (devinfo->flags & US_FL_CAPACITY_HEURISTICS)
 844                sdev->guess_capacity = 1;
 845
 846        /*
 847         * Some devices don't like MODE SENSE with page=0x3f,
 848         * which is the command used for checking if a device
 849         * is write-protected.  Now that we tell the sd driver
 850         * to do a 192-byte transfer with this command the
 851         * majority of devices work fine, but a few still can't
 852         * handle it.  The sd driver will simply assume those
 853         * devices are write-enabled.
 854         */
 855        if (devinfo->flags & US_FL_NO_WP_DETECT)
 856                sdev->skip_ms_page_3f = 1;
 857
 858        scsi_change_queue_depth(sdev, devinfo->qdepth - 2);
 859        return 0;
 860}
 861
 862static struct scsi_host_template uas_host_template = {
 863        .module = THIS_MODULE,
 864        .name = "uas",
 865        .queuecommand = uas_queuecommand,
 866        .target_alloc = uas_target_alloc,
 867        .slave_alloc = uas_slave_alloc,
 868        .slave_configure = uas_slave_configure,
 869        .eh_abort_handler = uas_eh_abort_handler,
 870        .eh_device_reset_handler = uas_eh_device_reset_handler,
 871        .this_id = -1,
 872        .skip_settle_delay = 1,
 873        .dma_boundary = PAGE_SIZE - 1,
 874};
 875
 876#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
 877                    vendorName, productName, useProtocol, useTransport, \
 878                    initFunction, flags) \
 879{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
 880        .driver_info = (flags) }
 881
 882static struct usb_device_id uas_usb_ids[] = {
 883#       include "unusual_uas.h"
 884        { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, USB_SC_SCSI, USB_PR_BULK) },
 885        { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, USB_SC_SCSI, USB_PR_UAS) },
 886        { }
 887};
 888MODULE_DEVICE_TABLE(usb, uas_usb_ids);
 889
 890#undef UNUSUAL_DEV
 891
 892static int uas_switch_interface(struct usb_device *udev,
 893                                struct usb_interface *intf)
 894{
 895        struct usb_host_interface *alt;
 896
 897        alt = uas_find_uas_alt_setting(intf);
 898        if (!alt)
 899                return -ENODEV;
 900
 901        return usb_set_interface(udev, alt->desc.bInterfaceNumber,
 902                        alt->desc.bAlternateSetting);
 903}
 904
 905static int uas_configure_endpoints(struct uas_dev_info *devinfo)
 906{
 907        struct usb_host_endpoint *eps[4] = { };
 908        struct usb_device *udev = devinfo->udev;
 909        int r;
 910
 911        r = uas_find_endpoints(devinfo->intf->cur_altsetting, eps);
 912        if (r)
 913                return r;
 914
 915        devinfo->cmd_pipe = usb_sndbulkpipe(udev,
 916                                            usb_endpoint_num(&eps[0]->desc));
 917        devinfo->status_pipe = usb_rcvbulkpipe(udev,
 918                                            usb_endpoint_num(&eps[1]->desc));
 919        devinfo->data_in_pipe = usb_rcvbulkpipe(udev,
 920                                            usb_endpoint_num(&eps[2]->desc));
 921        devinfo->data_out_pipe = usb_sndbulkpipe(udev,
 922                                            usb_endpoint_num(&eps[3]->desc));
 923
 924        if (udev->speed < USB_SPEED_SUPER) {
 925                devinfo->qdepth = 32;
 926                devinfo->use_streams = 0;
 927        } else {
 928                devinfo->qdepth = usb_alloc_streams(devinfo->intf, eps + 1,
 929                                                    3, MAX_CMNDS, GFP_NOIO);
 930                if (devinfo->qdepth < 0)
 931                        return devinfo->qdepth;
 932                devinfo->use_streams = 1;
 933        }
 934
 935        return 0;
 936}
 937
 938static void uas_free_streams(struct uas_dev_info *devinfo)
 939{
 940        struct usb_device *udev = devinfo->udev;
 941        struct usb_host_endpoint *eps[3];
 942
 943        eps[0] = usb_pipe_endpoint(udev, devinfo->status_pipe);
 944        eps[1] = usb_pipe_endpoint(udev, devinfo->data_in_pipe);
 945        eps[2] = usb_pipe_endpoint(udev, devinfo->data_out_pipe);
 946        usb_free_streams(devinfo->intf, eps, 3, GFP_NOIO);
 947}
 948
 949static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
 950{
 951        int result = -ENOMEM;
 952        struct Scsi_Host *shost = NULL;
 953        struct uas_dev_info *devinfo;
 954        struct usb_device *udev = interface_to_usbdev(intf);
 955        unsigned long dev_flags;
 956
 957        if (!uas_use_uas_driver(intf, id, &dev_flags))
 958                return -ENODEV;
 959
 960        if (uas_switch_interface(udev, intf))
 961                return -ENODEV;
 962
 963        shost = scsi_host_alloc(&uas_host_template,
 964                                sizeof(struct uas_dev_info));
 965        if (!shost)
 966                goto set_alt0;
 967
 968        shost->max_cmd_len = 16 + 252;
 969        shost->max_id = 1;
 970        shost->max_lun = 256;
 971        shost->max_channel = 0;
 972        shost->sg_tablesize = udev->bus->sg_tablesize;
 973
 974        devinfo = (struct uas_dev_info *)shost->hostdata;
 975        devinfo->intf = intf;
 976        devinfo->udev = udev;
 977        devinfo->resetting = 0;
 978        devinfo->shutdown = 0;
 979        devinfo->flags = dev_flags;
 980        init_usb_anchor(&devinfo->cmd_urbs);
 981        init_usb_anchor(&devinfo->sense_urbs);
 982        init_usb_anchor(&devinfo->data_urbs);
 983        spin_lock_init(&devinfo->lock);
 984        INIT_WORK(&devinfo->work, uas_do_work);
 985
 986        result = uas_configure_endpoints(devinfo);
 987        if (result)
 988                goto set_alt0;
 989
 990        /*
 991         * 1 tag is reserved for untagged commands +
 992         * 1 tag to avoid off by one errors in some bridge firmwares
 993         */
 994        shost->can_queue = devinfo->qdepth - 2;
 995
 996        usb_set_intfdata(intf, shost);
 997        result = scsi_add_host(shost, &intf->dev);
 998        if (result)
 999                goto free_streams;
1000
1001        scsi_scan_host(shost);
1002        return result;
1003
1004free_streams:
1005        uas_free_streams(devinfo);
1006        usb_set_intfdata(intf, NULL);
1007set_alt0:
1008        usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0);
1009        if (shost)
1010                scsi_host_put(shost);
1011        return result;
1012}
1013
1014static int uas_cmnd_list_empty(struct uas_dev_info *devinfo)
1015{
1016        unsigned long flags;
1017        int i, r = 1;
1018
1019        spin_lock_irqsave(&devinfo->lock, flags);
1020
1021        for (i = 0; i < devinfo->qdepth; i++) {
1022                if (devinfo->cmnd[i]) {
1023                        r = 0; /* Not empty */
1024                        break;
1025                }
1026        }
1027
1028        spin_unlock_irqrestore(&devinfo->lock, flags);
1029
1030        return r;
1031}
1032
1033/*
1034 * Wait for any pending cmnds to complete, on usb-2 sense_urbs may temporarily
1035 * get empty while there still is more work to do due to sense-urbs completing
1036 * with a READ/WRITE_READY iu code, so keep waiting until the list gets empty.
1037 */
1038static int uas_wait_for_pending_cmnds(struct uas_dev_info *devinfo)
1039{
1040        unsigned long start_time;
1041        int r;
1042
1043        start_time = jiffies;
1044        do {
1045                flush_work(&devinfo->work);
1046
1047                r = usb_wait_anchor_empty_timeout(&devinfo->sense_urbs, 5000);
1048                if (r == 0)
1049                        return -ETIME;
1050
1051                r = usb_wait_anchor_empty_timeout(&devinfo->data_urbs, 500);
1052                if (r == 0)
1053                        return -ETIME;
1054
1055                if (time_after(jiffies, start_time + 5 * HZ))
1056                        return -ETIME;
1057        } while (!uas_cmnd_list_empty(devinfo));
1058
1059        return 0;
1060}
1061
1062static int uas_pre_reset(struct usb_interface *intf)
1063{
1064        struct Scsi_Host *shost = usb_get_intfdata(intf);
1065        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
1066        unsigned long flags;
1067
1068        if (devinfo->shutdown)
1069                return 0;
1070
1071        /* Block new requests */
1072        spin_lock_irqsave(shost->host_lock, flags);
1073        scsi_block_requests(shost);
1074        spin_unlock_irqrestore(shost->host_lock, flags);
1075
1076        if (uas_wait_for_pending_cmnds(devinfo) != 0) {
1077                shost_printk(KERN_ERR, shost, "%s: timed out\n", __func__);
1078                scsi_unblock_requests(shost);
1079                return 1;
1080        }
1081
1082        uas_free_streams(devinfo);
1083
1084        return 0;
1085}
1086
1087static int uas_post_reset(struct usb_interface *intf)
1088{
1089        struct Scsi_Host *shost = usb_get_intfdata(intf);
1090        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
1091        unsigned long flags;
1092        int err;
1093
1094        if (devinfo->shutdown)
1095                return 0;
1096
1097        err = uas_configure_endpoints(devinfo);
1098        if (err && err != -ENODEV)
1099                shost_printk(KERN_ERR, shost,
1100                             "%s: alloc streams error %d after reset",
1101                             __func__, err);
1102
1103        /* we must unblock the host in every case lest we deadlock */
1104        spin_lock_irqsave(shost->host_lock, flags);
1105        scsi_report_bus_reset(shost, 0);
1106        spin_unlock_irqrestore(shost->host_lock, flags);
1107
1108        scsi_unblock_requests(shost);
1109
1110        return err ? 1 : 0;
1111}
1112
1113static int uas_suspend(struct usb_interface *intf, pm_message_t message)
1114{
1115        struct Scsi_Host *shost = usb_get_intfdata(intf);
1116        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
1117
1118        if (uas_wait_for_pending_cmnds(devinfo) != 0) {
1119                shost_printk(KERN_ERR, shost, "%s: timed out\n", __func__);
1120                return -ETIME;
1121        }
1122
1123        return 0;
1124}
1125
1126static int uas_resume(struct usb_interface *intf)
1127{
1128        return 0;
1129}
1130
1131static int uas_reset_resume(struct usb_interface *intf)
1132{
1133        struct Scsi_Host *shost = usb_get_intfdata(intf);
1134        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
1135        unsigned long flags;
1136        int err;
1137
1138        err = uas_configure_endpoints(devinfo);
1139        if (err) {
1140                shost_printk(KERN_ERR, shost,
1141                             "%s: alloc streams error %d after reset",
1142                             __func__, err);
1143                return -EIO;
1144        }
1145
1146        spin_lock_irqsave(shost->host_lock, flags);
1147        scsi_report_bus_reset(shost, 0);
1148        spin_unlock_irqrestore(shost->host_lock, flags);
1149
1150        return 0;
1151}
1152
1153static void uas_disconnect(struct usb_interface *intf)
1154{
1155        struct Scsi_Host *shost = usb_get_intfdata(intf);
1156        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
1157        unsigned long flags;
1158
1159        spin_lock_irqsave(&devinfo->lock, flags);
1160        devinfo->resetting = 1;
1161        spin_unlock_irqrestore(&devinfo->lock, flags);
1162
1163        cancel_work_sync(&devinfo->work);
1164        usb_kill_anchored_urbs(&devinfo->cmd_urbs);
1165        usb_kill_anchored_urbs(&devinfo->sense_urbs);
1166        usb_kill_anchored_urbs(&devinfo->data_urbs);
1167        uas_zap_pending(devinfo, DID_NO_CONNECT);
1168
1169        scsi_remove_host(shost);
1170        uas_free_streams(devinfo);
1171        scsi_host_put(shost);
1172}
1173
1174/*
1175 * Put the device back in usb-storage mode on shutdown, as some BIOS-es
1176 * hang on reboot when the device is still in uas mode. Note the reset is
1177 * necessary as some devices won't revert to usb-storage mode without it.
1178 */
1179static void uas_shutdown(struct device *dev)
1180{
1181        struct usb_interface *intf = to_usb_interface(dev);
1182        struct usb_device *udev = interface_to_usbdev(intf);
1183        struct Scsi_Host *shost = usb_get_intfdata(intf);
1184        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
1185
1186        if (system_state != SYSTEM_RESTART)
1187                return;
1188
1189        devinfo->shutdown = 1;
1190        uas_free_streams(devinfo);
1191        usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0);
1192        usb_reset_device(udev);
1193}
1194
1195static struct usb_driver uas_driver = {
1196        .name = "uas",
1197        .probe = uas_probe,
1198        .disconnect = uas_disconnect,
1199        .pre_reset = uas_pre_reset,
1200        .post_reset = uas_post_reset,
1201        .suspend = uas_suspend,
1202        .resume = uas_resume,
1203        .reset_resume = uas_reset_resume,
1204        .drvwrap.driver.shutdown = uas_shutdown,
1205        .id_table = uas_usb_ids,
1206};
1207
1208module_usb_driver(uas_driver);
1209
1210MODULE_LICENSE("GPL");
1211MODULE_IMPORT_NS(USB_STORAGE);
1212MODULE_AUTHOR(
1213        "Hans de Goede <hdegoede@redhat.com>, Matthew Wilcox and Sarah Sharp");
1214