linux-old/drivers/usb/storage/shuttle_usbat.c
<<
>>
Prefs
   1/* Driver for SCM Microsystems USB-ATAPI cable
   2 *
   3 * $Id: shuttle_usbat.c,v 1.16 2002/02/25 00:40:13 mdharm Exp $
   4 *
   5 * Current development and maintenance by:
   6 *   (c) 2000, 2001 Robert Baruch (autophile@starband.net)
   7 *
   8 * Developed with the assistance of:
   9 *   (c) 2002 Alan Stern <stern@rowland.org>
  10 *
  11 * Many originally ATAPI devices were slightly modified to meet the USB
  12 * market by using some kind of translation from ATAPI to USB on the host,
  13 * and the peripheral would translate from USB back to ATAPI.
  14 *
  15 * SCM Microsystems (www.scmmicro.com) makes a device, sold to OEM's only, 
  16 * which does the USB-to-ATAPI conversion.  By obtaining the data sheet on
  17 * their device under nondisclosure agreement, I have been able to write
  18 * this driver for Linux.
  19 *
  20 * The chip used in the device can also be used for EPP and ISA translation
  21 * as well. This driver is only guaranteed to work with the ATAPI
  22 * translation.
  23 *
  24 * The only peripheral that I know of (as of 27 Mar 2001) that uses this
  25 * device is the Hewlett-Packard 8200e/8210e/8230e CD-Writer Plus.
  26 *
  27 * This program is free software; you can redistribute it and/or modify it
  28 * under the terms of the GNU General Public License as published by the
  29 * Free Software Foundation; either version 2, or (at your option) any
  30 * later version.
  31 *
  32 * This program is distributed in the hope that it will be useful, but
  33 * WITHOUT ANY WARRANTY; without even the implied warranty of
  34 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  35 * General Public License for more details.
  36 *
  37 * You should have received a copy of the GNU General Public License along
  38 * with this program; if not, write to the Free Software Foundation, Inc.,
  39 * 675 Mass Ave, Cambridge, MA 02139, USA.
  40 */
  41
  42#include "transport.h"
  43#include "protocol.h"
  44#include "usb.h"
  45#include "debug.h"
  46#include "shuttle_usbat.h"
  47
  48#include <linux/sched.h>
  49#include <linux/errno.h>
  50#include <linux/slab.h>
  51
  52extern int usb_stor_control_msg(struct us_data *us, unsigned int pipe,
  53        u8 request, u8 requesttype, u16 value, u16 index,
  54        void *data, u16 size);
  55extern int usb_stor_bulk_msg(struct us_data *us, void *data, int pipe,
  56        unsigned int len, unsigned int *act_len);
  57
  58#define short_pack(LSB,MSB) ( ((u16)(LSB)) | ( ((u16)(MSB))<<8 ) )
  59#define LSB_of(s) ((s)&0xFF)
  60#define MSB_of(s) ((s)>>8)
  61
  62int transferred = 0;
  63
  64/*
  65 * Send a control message and wait for the response.
  66 *
  67 * us - the pointer to the us_data structure for the device to use
  68 *
  69 * request - the URB Setup Packet's first 6 bytes. The first byte always
  70 *  corresponds to the request type, and the second byte always corresponds
  71 *  to the request.  The other 4 bytes do not correspond to value and index,
  72 *  since they are used in a custom way by the SCM protocol.
  73 *
  74 * xfer_data - a buffer from which to get, or to which to store, any data
  75 *  that gets send or received, respectively, with the URB. Even though
  76 *  it looks like we allocate a buffer in this code for the data, xfer_data
  77 *  must contain enough allocated space.
  78 *
  79 * xfer_len - the number of bytes to send or receive with the URB.
  80 *
  81 */
  82
  83static int usbat_send_control(struct us_data *us,
  84                int pipe,
  85                unsigned char request,
  86                unsigned char requesttype,
  87                unsigned short value,
  88                unsigned short index,
  89                unsigned char *xfer_data,
  90                unsigned int xfer_len) {
  91
  92        int result;
  93
  94        // Send the URB to the device and wait for a response.
  95
  96        /* Why are request and request type reversed in this call? */
  97
  98        result = usb_stor_control_msg(us, pipe,
  99                        request, requesttype, value, index,
 100                        xfer_data, xfer_len);
 101
 102
 103        // Check the return code for the command.
 104
 105        if (result < 0) {
 106                /* if the command was aborted, indicate that */
 107                if (result == -ECONNRESET)
 108                        return USB_STOR_TRANSPORT_ABORTED;
 109
 110                /* a stall is a fatal condition from the device */
 111                if (result == -EPIPE) {
 112                        US_DEBUGP("-- Stall on control pipe. Clearing\n");
 113                        result = usb_stor_clear_halt(us, pipe);
 114                        US_DEBUGP("-- usb_stor_clear_halt() returns %d\n", result);
 115                        return USB_STOR_TRANSPORT_FAILED;
 116                }
 117
 118                /* Uh oh... serious problem here */
 119                return USB_STOR_TRANSPORT_ERROR;
 120        }
 121
 122        return USB_STOR_TRANSPORT_GOOD;
 123}
 124
 125static int usbat_raw_bulk(struct us_data *us, 
 126                int direction,
 127                unsigned char *data,
 128                unsigned short len) {
 129
 130        int result;
 131        int act_len;
 132        int pipe;
 133
 134        if (direction == SCSI_DATA_READ)
 135                pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in);
 136        else
 137                pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
 138
 139        result = usb_stor_bulk_msg(us, data, pipe, len, &act_len);
 140
 141        /* if we stall, we need to clear it before we go on */
 142        if (result == -EPIPE) {
 143                US_DEBUGP("EPIPE: clearing endpoint halt for"
 144                        " pipe 0x%x, stalled at %d bytes\n",
 145                        pipe, act_len);
 146                usb_stor_clear_halt(us, pipe);
 147        }
 148
 149        if (result) {
 150
 151                /* NAK - that means we've retried a few times already */
 152                if (result == -ETIMEDOUT) {
 153                        US_DEBUGP("usbat_raw_bulk():"
 154                                " device NAKed\n");
 155                        return US_BULK_TRANSFER_FAILED;
 156                }
 157
 158                /* -ECONNRESET -- we canceled this transfer */
 159                if (result == -ECONNRESET) {
 160                        US_DEBUGP("usbat_raw_bulk():"
 161                                " transfer aborted\n");
 162                        return US_BULK_TRANSFER_ABORTED;
 163                }
 164
 165                if (result == -EPIPE) {
 166                        US_DEBUGP("usbat_raw_bulk():"
 167                                " output pipe stalled\n");
 168                        return US_BULK_TRANSFER_SHORT;
 169                }
 170
 171                /* the catch-all case */
 172                US_DEBUGP("us_transfer_partial(): unknown error\n");
 173                return US_BULK_TRANSFER_FAILED;
 174        }
 175
 176        if (act_len != len) {
 177                US_DEBUGP("Warning: Transferred only %d bytes\n",
 178                        act_len);
 179                return US_BULK_TRANSFER_SHORT;
 180        }
 181
 182        US_DEBUGP("Transferred %s %d of %d bytes\n", 
 183                direction==SCSI_DATA_READ ? "in" : "out", act_len, len);
 184
 185        return US_BULK_TRANSFER_GOOD;
 186}
 187
 188/*
 189 * Note: direction must be set if command_len == 0.
 190 */
 191
 192static int usbat_bulk_transport(struct us_data *us,
 193                          unsigned char *command,
 194                          unsigned short command_len,
 195                          int direction,
 196                          unsigned char *data,
 197                          unsigned short len,
 198                          int use_sg) {
 199
 200        int result = USB_STOR_TRANSPORT_GOOD;
 201        int transferred = 0;
 202        int i;
 203        struct scatterlist *sg;
 204
 205        if (len==0)
 206                return USB_STOR_TRANSPORT_GOOD;
 207
 208        /* transfer the data payload for the command, if there is any */
 209
 210        if (command_len != 0)
 211                direction = (command[0]&0x80) ? SCSI_DATA_READ :
 212                        SCSI_DATA_WRITE;
 213
 214        if (!use_sg)
 215                result = usbat_raw_bulk(us, direction, data, len);
 216        else {
 217                sg = (struct scatterlist *)data;
 218                for (i=0; i<use_sg && transferred<len; i++) {
 219                        result = usbat_raw_bulk(us, direction,
 220                                sg[i].address, 
 221                                len-transferred > sg[i].length ?
 222                                        sg[i].length : len-transferred);
 223                        if (result!=US_BULK_TRANSFER_GOOD)
 224                                break;
 225                        transferred += sg[i].length;
 226                }
 227        }
 228
 229        return result;
 230}
 231
 232int usbat_read(struct us_data *us,
 233             unsigned char access,
 234             unsigned char reg, 
 235             unsigned char *content) {
 236
 237        int result;
 238
 239        result = usbat_send_control(us,
 240                usb_rcvctrlpipe(us->pusb_dev,0),
 241                access,
 242                0xC0,
 243                (u16)reg,
 244                0,
 245                content,
 246                1);
 247
 248        return result;
 249}
 250
 251int usbat_write(struct us_data *us,
 252             unsigned char access,
 253             unsigned char reg, 
 254             unsigned char content) {
 255
 256        int result;
 257
 258        result = usbat_send_control(us,
 259                usb_sndctrlpipe(us->pusb_dev,0),
 260                access|0x01,
 261                0x40,
 262                short_pack(reg, content),
 263                0,
 264                NULL,
 265                0);
 266
 267        return result;
 268}
 269
 270int usbat_set_shuttle_features(struct us_data *us,
 271             unsigned char external_trigger,
 272             unsigned char epp_control, 
 273             unsigned char mask_byte, 
 274             unsigned char test_pattern, 
 275             unsigned char subcountH, 
 276             unsigned char subcountL) {
 277
 278        int result;
 279        unsigned char command[8] = {
 280                0x40, 0x81, epp_control, external_trigger,
 281                test_pattern, mask_byte, subcountL, subcountH
 282        };
 283
 284        result = usbat_send_control(us,
 285                usb_sndctrlpipe(us->pusb_dev,0),
 286                0x80,
 287                0x40,
 288                0,
 289                0,
 290                command,
 291                8);
 292
 293        return result;
 294}
 295
 296int usbat_read_block(struct us_data *us,
 297             unsigned char access,
 298             unsigned char reg, 
 299             unsigned char *content,
 300             unsigned short len,
 301             int use_sg) {
 302
 303        int result;
 304        unsigned char command[8] = {
 305                0xC0, access|0x02, reg, 0x00, 0x00, 0x00, 
 306                LSB_of(len), MSB_of(len)
 307        };
 308
 309        result = usbat_send_control(us,
 310                usb_sndctrlpipe(us->pusb_dev,0),
 311                0x80,
 312                0x40,
 313                0,
 314                0,
 315                command,
 316                8);
 317
 318        if (result != USB_STOR_TRANSPORT_GOOD)
 319                return result;
 320
 321        result = usbat_bulk_transport(us,
 322                NULL, 0, SCSI_DATA_READ, content, len, use_sg);
 323
 324        return result;
 325}
 326
 327/*
 328 * Block, waiting for an ATA device to become not busy or to report
 329 * an error condition.
 330 */
 331
 332int usbat_wait_not_busy(struct us_data *us, int minutes) {
 333
 334        int i;
 335        int result;
 336        unsigned char status;
 337
 338        /* Synchronizing cache on a CDR could take a heck of a long time,
 339         * but probably not more than 10 minutes or so. On the other hand,
 340         * doing a full blank on a CDRW at speed 1 will take about 75
 341         * minutes!
 342         */
 343
 344        for (i=0; i<1200+minutes*60; i++) {
 345
 346                result = usbat_read(us, USBAT_ATA, 0x17, &status);
 347
 348                if (result!=USB_STOR_TRANSPORT_GOOD)
 349                        return result;
 350                if (status&0x01) { // check condition
 351                        result = usbat_read(us, USBAT_ATA, 0x10, &status);
 352                        return USB_STOR_TRANSPORT_FAILED;
 353                }
 354                if (status&0x20) // device fault
 355                        return USB_STOR_TRANSPORT_FAILED;
 356
 357                if ((status&0x80)==0x00) { // not busy
 358                        US_DEBUGP("Waited not busy for %d steps\n", i);
 359                        return USB_STOR_TRANSPORT_GOOD;
 360                }
 361
 362                if (i<500)
 363                        wait_ms(10); // 5 seconds
 364                else if (i<700)
 365                        wait_ms(50); // 10 seconds
 366                else if (i<1200)
 367                        wait_ms(100); // 50 seconds
 368                else
 369                        wait_ms(1000); // X minutes
 370        }
 371
 372        US_DEBUGP("Waited not busy for %d minutes, timing out.\n",
 373                minutes);
 374        return USB_STOR_TRANSPORT_FAILED;
 375}
 376
 377int usbat_write_block(struct us_data *us,
 378             unsigned char access,
 379             unsigned char reg, 
 380             unsigned char *content,
 381             unsigned short len,
 382             int use_sg,
 383             int minutes) {
 384
 385        int result;
 386        unsigned char command[8] = {
 387                0x40, access|0x03, reg, 0x00, 0x00, 0x00, 
 388                LSB_of(len), MSB_of(len)
 389        };
 390
 391        result = usbat_send_control(us,
 392                usb_sndctrlpipe(us->pusb_dev,0),
 393                0x80,
 394                0x40,
 395                0,
 396                0,
 397                command,
 398                8);
 399
 400        if (result != USB_STOR_TRANSPORT_GOOD)
 401                return result;
 402
 403        result = usbat_bulk_transport(us,
 404                NULL, 0, SCSI_DATA_WRITE, content, len, use_sg);
 405
 406        if (result != USB_STOR_TRANSPORT_GOOD)
 407                return result;
 408
 409        return usbat_wait_not_busy(us, minutes);
 410}
 411
 412int usbat_rw_block_test(struct us_data *us,
 413             unsigned char access,
 414             unsigned char *registers,
 415             unsigned char *data_out,
 416             unsigned short num_registers,
 417             unsigned char data_reg, 
 418             unsigned char status_reg, 
 419             unsigned char timeout, 
 420             unsigned char qualifier, 
 421             int direction,
 422             unsigned char *content,
 423             unsigned short len,
 424             int use_sg,
 425             int minutes) {
 426
 427        int result;
 428
 429        // Not really sure the 0x07, 0x17, 0xfc, 0xe7 is necessary here,
 430        // but that's what came out of the trace every single time.
 431
 432        unsigned char command[16] = {
 433                0x40, access|0x07, 0x07, 0x17, 0xfc, 0xe7,
 434                LSB_of(num_registers*2), MSB_of(num_registers*2),
 435                (direction==SCSI_DATA_WRITE ? 0x40 : 0xC0), 
 436                access|(direction==SCSI_DATA_WRITE ? 0x05 : 0x04), 
 437                data_reg, status_reg,
 438                timeout, qualifier, LSB_of(len), MSB_of(len)
 439        };
 440
 441        int i;
 442        unsigned char data[num_registers*2];
 443        unsigned char status;
 444
 445        for (i=0; i<num_registers; i++) {
 446                data[i<<1] = registers[i];
 447                data[1+(i<<1)] = data_out[i];
 448        }
 449
 450        for (i=0; i<20; i++) {
 451
 452                /*
 453                 * The first time we send the full command, which consists
 454                 * of downloading the SCSI command followed by downloading
 455                 * the data via a write-and-test.  Any other time we only
 456                 * send the command to download the data -- the SCSI command
 457                 * is still 'active' in some sense in the device.
 458                 * 
 459                 * We're only going to try sending the data 10 times. After
 460                 * that, we just return a failure.
 461                 */
 462
 463                result = usbat_send_control(us,
 464                          usb_sndctrlpipe(us->pusb_dev,0),
 465                        0x80,
 466                        0x40,
 467                        0,
 468                        0,
 469                        (i==0 ? command : command+8),
 470                        (i==0 ? 16 : 8));
 471
 472                if (result != USB_STOR_TRANSPORT_GOOD)
 473                        return result;
 474
 475                if (i==0) {
 476
 477                        result = usbat_bulk_transport(us,
 478                                NULL, 0, SCSI_DATA_WRITE, 
 479                                data, num_registers*2, 0);
 480
 481                        if (result!=USB_STOR_TRANSPORT_GOOD)
 482                                return result;
 483
 484                }
 485
 486
 487                //US_DEBUGP("Transfer %s %d bytes, sg buffers %d\n",
 488                //      direction == SCSI_DATA_WRITE ? "out" : "in",
 489                //      len, use_sg);
 490
 491                result = usbat_bulk_transport(us,
 492                        NULL, 0, direction, content, len, use_sg);
 493
 494                /*
 495                 * If we get a stall on the bulk download, we'll retry
 496                 * the bulk download -- but not the SCSI command because
 497                 * in some sense the SCSI command is still 'active' and
 498                 * waiting for the data. Don't ask me why this should be;
 499                 * I'm only following what the Windoze driver did.
 500                 *
 501                 * Note that a stall for the test-and-read/write command means
 502                 * that the test failed. In this case we're testing to make
 503                 * sure that the device is error-free
 504                 * (i.e. bit 0 -- CHK -- of status is 0). The most likely
 505                 * hypothesis is that the USBAT chip somehow knows what
 506                 * the device will accept, but doesn't give the device any
 507                 * data until all data is received. Thus, the device would
 508                 * still be waiting for the first byte of data if a stall
 509                 * occurs, even if the stall implies that some data was
 510                 * transferred.
 511                 */
 512
 513                if (result == US_BULK_TRANSFER_SHORT) {
 514
 515                        /*
 516                         * If we're reading and we stalled, then clear
 517                         * the bulk output pipe only the first time.
 518                         */
 519
 520                        if (direction==SCSI_DATA_READ && i==0)
 521                                usb_stor_clear_halt(us,
 522                                        usb_sndbulkpipe(us->pusb_dev,
 523                                          us->ep_out));
 524                        /*
 525                         * Read status: is the device angry, or just busy?
 526                         */
 527
 528                        result = usbat_read(us, USBAT_ATA, 
 529                                direction==SCSI_DATA_WRITE ? 0x17 : 0x0E, 
 530                                &status);
 531
 532                        if (result!=USB_STOR_TRANSPORT_GOOD)
 533                                return result;
 534                        if (status&0x01) // check condition
 535                                return USB_STOR_TRANSPORT_FAILED;
 536                        if (status&0x20) // device fault
 537                                return USB_STOR_TRANSPORT_FAILED;
 538
 539                        US_DEBUGP("Redoing %s\n",
 540                          direction==SCSI_DATA_WRITE ? "write" : "read");
 541
 542                } else if (result != US_BULK_TRANSFER_GOOD)
 543                        return result;
 544                else
 545                        return usbat_wait_not_busy(us, minutes);
 546
 547        }
 548
 549        US_DEBUGP("Bummer! %s bulk data 20 times failed.\n",
 550                direction==SCSI_DATA_WRITE ? "Writing" : "Reading");
 551
 552        return USB_STOR_TRANSPORT_FAILED;
 553}
 554
 555/*
 556 * Write data to multiple registers at once. Not meant for large
 557 * transfers of data!
 558 */
 559
 560int usbat_multiple_write(struct us_data *us, 
 561                        unsigned char access,
 562                        unsigned char *registers,
 563                        unsigned char *data_out,
 564                        unsigned short num_registers) {
 565
 566        int result;
 567        unsigned char data[num_registers*2];
 568        int i;
 569        unsigned char command[8] = {
 570                0x40, access|0x07, 0x00, 0x00, 0x00, 0x00,
 571                LSB_of(num_registers*2), MSB_of(num_registers*2)
 572        };
 573
 574        for (i=0; i<num_registers; i++) {
 575                data[i<<1] = registers[i];
 576                data[1+(i<<1)] = data_out[i];
 577        }
 578
 579        result = usbat_send_control(us,
 580                usb_sndctrlpipe(us->pusb_dev,0),
 581                0x80,
 582                0x40,
 583                0,
 584                0,
 585                command,
 586                8);
 587
 588        if (result != USB_STOR_TRANSPORT_GOOD)
 589                return result;
 590
 591        result = usbat_bulk_transport(us,
 592                NULL, 0, SCSI_DATA_WRITE, data, num_registers*2, 0);
 593
 594        if (result!=USB_STOR_TRANSPORT_GOOD)
 595                return result;
 596
 597        return usbat_wait_not_busy(us, 0);
 598}
 599
 600int usbat_read_user_io(struct us_data *us,
 601                unsigned char *data_flags) {
 602
 603        int result;
 604
 605        result = usbat_send_control(us,
 606                usb_rcvctrlpipe(us->pusb_dev,0),
 607                0x82,
 608                0xC0,
 609                0,
 610                0,
 611                data_flags,
 612                1);
 613
 614        return result;
 615}
 616
 617int usbat_write_user_io(struct us_data *us,
 618                unsigned char enable_flags,
 619                unsigned char data_flags) {
 620
 621        int result;
 622
 623        result = usbat_send_control(us,
 624                usb_sndctrlpipe(us->pusb_dev,0),
 625                0x82,
 626                0x40,
 627                short_pack(enable_flags, data_flags),
 628                0,
 629                NULL,
 630                0);
 631
 632        return result;
 633}
 634
 635/*
 636 * Squeeze a potentially huge (> 65535 byte) read10 command into
 637 * a little ( <= 65535 byte) ATAPI pipe
 638 */
 639
 640int usbat_handle_read10(struct us_data *us,
 641                unsigned char *registers,
 642                unsigned char *data,
 643                Scsi_Cmnd *srb) {
 644
 645        int result = USB_STOR_TRANSPORT_GOOD;
 646        unsigned char *buffer;
 647        unsigned int len;
 648        unsigned int sector;
 649        unsigned int amount;
 650        struct scatterlist *sg = NULL;
 651        int sg_segment = 0;
 652        int sg_offset = 0;
 653
 654        US_DEBUGP("handle_read10: transfersize %d\n",
 655                srb->transfersize);
 656
 657        if (srb->request_bufflen < 0x10000) {
 658
 659                result = usbat_rw_block_test(us, USBAT_ATA, 
 660                        registers, data, 19,
 661                        0x10, 0x17, 0xFD, 0x30,
 662                        SCSI_DATA_READ,
 663                        srb->request_buffer, 
 664                        srb->request_bufflen, srb->use_sg, 1);
 665
 666                return result;
 667        }
 668
 669        /*
 670         * Since we're requesting more data than we can handle in
 671         * a single read command (max is 64k-1), we will perform
 672         * multiple reads, but each read must be in multiples of
 673         * a sector.  Luckily the sector size is in srb->transfersize
 674         * (see linux/drivers/scsi/sr.c).
 675         */
 676
 677        if (data[7+0] == GPCMD_READ_CD) {
 678                len = short_pack(data[7+9], data[7+8]);
 679                len <<= 16;
 680                len |= data[7+7];
 681                US_DEBUGP("handle_read10: GPCMD_READ_CD: len %d\n", len);
 682                srb->transfersize = srb->request_bufflen/len;
 683        }
 684
 685        if (!srb->transfersize)  {
 686                srb->transfersize = 2048; /* A guess */
 687                US_DEBUGP("handle_read10: transfersize 0, forcing %d\n",
 688                        srb->transfersize);
 689        }
 690
 691        len = (65535/srb->transfersize) * srb->transfersize;
 692        US_DEBUGP("Max read is %d bytes\n", len);
 693        buffer = kmalloc(len, GFP_NOIO);
 694        if (buffer == NULL) // bloody hell!
 695                return USB_STOR_TRANSPORT_FAILED;
 696        sector = short_pack(data[7+3], data[7+2]);
 697        sector <<= 16;
 698        sector |= short_pack(data[7+5], data[7+4]);
 699        transferred = 0;
 700
 701        if (srb->use_sg) {
 702                sg = (struct scatterlist *)srb->request_buffer;
 703                sg_segment = 0; // for keeping track of where we are in
 704                sg_offset = 0;  // the scatter/gather list
 705        }
 706
 707        while (transferred != srb->request_bufflen) {
 708
 709                if (len > srb->request_bufflen - transferred)
 710                        len = srb->request_bufflen - transferred;
 711
 712                data[3] = len&0xFF;       // (cylL) = expected length (L)
 713                data[4] = (len>>8)&0xFF;  // (cylH) = expected length (H)
 714
 715                // Fix up the SCSI command sector and num sectors
 716
 717                data[7+2] = MSB_of(sector>>16); // SCSI command sector
 718                data[7+3] = LSB_of(sector>>16);
 719                data[7+4] = MSB_of(sector&0xFFFF);
 720                data[7+5] = LSB_of(sector&0xFFFF);
 721                if (data[7+0] == GPCMD_READ_CD)
 722                        data[7+6] = 0;
 723                data[7+7] = MSB_of(len / srb->transfersize); // SCSI command
 724                data[7+8] = LSB_of(len / srb->transfersize); // num sectors
 725
 726                result = usbat_rw_block_test(us, USBAT_ATA, 
 727                        registers, data, 19,
 728                        0x10, 0x17, 0xFD, 0x30,
 729                        SCSI_DATA_READ,
 730                        buffer,
 731                        len, 0, 1);
 732
 733                if (result != USB_STOR_TRANSPORT_GOOD)
 734                        break;
 735
 736                // Transfer the received data into the srb buffer
 737
 738                if (!srb->use_sg) {
 739                        memcpy(srb->request_buffer+transferred, buffer, len);
 740                } else {
 741                        amount = 0;
 742                        while (amount<len) {
 743                                if (len - amount >= 
 744                                          sg[sg_segment].length-sg_offset) {
 745                                  memcpy(sg[sg_segment].address + sg_offset,
 746                                        buffer + amount,
 747                                        sg[sg_segment].length - sg_offset);
 748                                  amount += 
 749                                          sg[sg_segment].length-sg_offset;
 750                                  sg_segment++;
 751                                  sg_offset=0;
 752                                } else {
 753                                  memcpy(sg[sg_segment].address + sg_offset,
 754                                        buffer + amount,
 755                                        len - amount);
 756                                  sg_offset += (len - amount);
 757                                  amount = len;
 758                                }
 759                        }
 760                }
 761
 762                // Update the amount transferred and the sector number
 763
 764                transferred += len;
 765                sector += len / srb->transfersize;
 766
 767        } // while transferred != srb->request_bufflen
 768
 769        kfree(buffer);
 770        return result;
 771}
 772
 773static int hp_8200e_select_and_test_registers(struct us_data *us) {
 774
 775        int result;
 776        int selector;
 777        unsigned char status;
 778
 779        // try device = master, then device = slave.
 780
 781        for (selector = 0xA0; selector <= 0xB0; selector += 0x10) {
 782
 783                if ( (result = usbat_write(us, USBAT_ATA, 0x16, selector)) != 
 784                                USB_STOR_TRANSPORT_GOOD)
 785                        return result;
 786
 787                if ( (result = usbat_read(us, USBAT_ATA, 0x17, &status)) != 
 788                                USB_STOR_TRANSPORT_GOOD)
 789                        return result;
 790
 791                if ( (result = usbat_read(us, USBAT_ATA, 0x16, &status)) != 
 792                                USB_STOR_TRANSPORT_GOOD)
 793                        return result;
 794
 795                if ( (result = usbat_read(us, USBAT_ATA, 0x14, &status)) != 
 796                                USB_STOR_TRANSPORT_GOOD)
 797                        return result;
 798
 799                if ( (result = usbat_read(us, USBAT_ATA, 0x15, &status)) != 
 800                                USB_STOR_TRANSPORT_GOOD)
 801                        return result;
 802
 803                if ( (result = usbat_write(us, USBAT_ATA, 0x14, 0x55)) != 
 804                                USB_STOR_TRANSPORT_GOOD)
 805                        return result;
 806
 807                if ( (result = usbat_write(us, USBAT_ATA, 0x15, 0xAA)) != 
 808                                USB_STOR_TRANSPORT_GOOD)
 809                        return result;
 810
 811                if ( (result = usbat_read(us, USBAT_ATA, 0x14, &status)) != 
 812                                USB_STOR_TRANSPORT_GOOD)
 813                        return result;
 814
 815                if ( (result = usbat_read(us, USBAT_ATA, 0x15, &status)) != 
 816                                USB_STOR_TRANSPORT_GOOD)
 817                        return result;
 818        }
 819
 820        return result;
 821}
 822
 823int init_8200e(struct us_data *us) {
 824
 825        int result;
 826        unsigned char status;
 827
 828        // Enable peripheral control signals
 829
 830        if ( (result = usbat_write_user_io(us,
 831          USBAT_UIO_OE1 | USBAT_UIO_OE0,
 832          USBAT_UIO_EPAD | USBAT_UIO_1)) != USB_STOR_TRANSPORT_GOOD)
 833                return result;
 834
 835        US_DEBUGP("INIT 1\n");
 836
 837        wait_ms(2000);
 838
 839        if ( (result = usbat_read_user_io(us, &status)) !=
 840                        USB_STOR_TRANSPORT_GOOD)
 841                return result;
 842
 843        US_DEBUGP("INIT 2\n");
 844
 845        if ( (result = usbat_read_user_io(us, &status)) !=
 846                        USB_STOR_TRANSPORT_GOOD)
 847                return result;
 848
 849        US_DEBUGP("INIT 3\n");
 850
 851        // Reset peripheral, enable periph control signals
 852        // (bring reset signal up)
 853
 854        if ( (result = usbat_write_user_io(us,
 855          USBAT_UIO_DRVRST | USBAT_UIO_OE1 | USBAT_UIO_OE0,
 856          USBAT_UIO_EPAD | USBAT_UIO_1)) != USB_STOR_TRANSPORT_GOOD)
 857                return result;
 858
 859        US_DEBUGP("INIT 4\n");
 860
 861        // Enable periph control signals
 862        // (bring reset signal down)
 863
 864        if ( (result = usbat_write_user_io(us,
 865          USBAT_UIO_OE1 | USBAT_UIO_OE0,
 866          USBAT_UIO_EPAD | USBAT_UIO_1)) != USB_STOR_TRANSPORT_GOOD)
 867                return result;
 868
 869        US_DEBUGP("INIT 5\n");
 870
 871        wait_ms(250);
 872
 873        // Write 0x80 to ISA port 0x3F
 874
 875        if ( (result = usbat_write(us, USBAT_ISA, 0x3F, 0x80)) !=
 876                        USB_STOR_TRANSPORT_GOOD)
 877                return result;
 878
 879        US_DEBUGP("INIT 6\n");
 880
 881        // Read ISA port 0x27
 882
 883        if ( (result = usbat_read(us, USBAT_ISA, 0x27, &status)) !=
 884                        USB_STOR_TRANSPORT_GOOD)
 885                return result;
 886
 887        US_DEBUGP("INIT 7\n");
 888
 889        if ( (result = usbat_read_user_io(us, &status)) !=
 890                        USB_STOR_TRANSPORT_GOOD)
 891                return result;
 892
 893        US_DEBUGP("INIT 8\n");
 894
 895        if ( (result = hp_8200e_select_and_test_registers(us)) !=
 896                         USB_STOR_TRANSPORT_GOOD)
 897                return result;
 898
 899        US_DEBUGP("INIT 9\n");
 900
 901        if ( (result = usbat_read_user_io(us, &status)) !=
 902                        USB_STOR_TRANSPORT_GOOD)
 903                return result;
 904
 905        US_DEBUGP("INIT 10\n");
 906
 907        // Enable periph control signals and card detect
 908
 909        if ( (result = usbat_write_user_io(us,
 910          USBAT_UIO_ACKD |USBAT_UIO_OE1 | USBAT_UIO_OE0,
 911          USBAT_UIO_EPAD | USBAT_UIO_1)) != USB_STOR_TRANSPORT_GOOD)
 912                return result;
 913
 914        US_DEBUGP("INIT 11\n");
 915
 916        if ( (result = usbat_read_user_io(us, &status)) !=
 917                        USB_STOR_TRANSPORT_GOOD)
 918                return result;
 919
 920        US_DEBUGP("INIT 12\n");
 921
 922        wait_ms(1400);
 923
 924        if ( (result = usbat_read_user_io(us, &status)) !=
 925                        USB_STOR_TRANSPORT_GOOD)
 926                return result;
 927
 928        US_DEBUGP("INIT 13\n");
 929
 930        if ( (result = hp_8200e_select_and_test_registers(us)) !=
 931                         USB_STOR_TRANSPORT_GOOD)
 932                return result;
 933
 934        US_DEBUGP("INIT 14\n");
 935
 936        if ( (result = usbat_set_shuttle_features(us, 
 937                        0x83, 0x00, 0x88, 0x08, 0x15, 0x14)) !=
 938                         USB_STOR_TRANSPORT_GOOD)
 939                return result;
 940
 941        US_DEBUGP("INIT 15\n");
 942
 943        return result;
 944}
 945
 946/*
 947 * Transport for the HP 8200e
 948 */
 949int hp8200e_transport(Scsi_Cmnd *srb, struct us_data *us)
 950{
 951        int result;
 952        unsigned char status;
 953        unsigned char registers[32];
 954        unsigned char data[32];
 955        unsigned int len;
 956        int i;
 957        char string[64];
 958
 959        len = srb->request_bufflen;
 960
 961        /* Send A0 (ATA PACKET COMMAND).
 962           Note: I guess we're never going to get any of the ATA
 963           commands... just ATA Packet Commands.
 964         */
 965
 966        registers[0] = 0x11;
 967        registers[1] = 0x12;
 968        registers[2] = 0x13;
 969        registers[3] = 0x14;
 970        registers[4] = 0x15;
 971        registers[5] = 0x16;
 972        registers[6] = 0x17;
 973        data[0] = 0x00;
 974        data[1] = 0x00;
 975        data[2] = 0x00;
 976        data[3] = len&0xFF;             // (cylL) = expected length (L)
 977        data[4] = (len>>8)&0xFF;        // (cylH) = expected length (H)
 978        data[5] = 0xB0;                 // (device sel) = slave
 979        data[6] = 0xA0;                 // (command) = ATA PACKET COMMAND
 980
 981        for (i=7; i<19; i++) {
 982                registers[i] = 0x10;
 983                data[i] = (i-7 >= srb->cmd_len) ? 0 : srb->cmnd[i-7];
 984        }
 985
 986        result = usbat_read(us, USBAT_ATA, 0x17, &status);
 987        US_DEBUGP("Status = %02X\n", status);
 988
 989        if (srb->cmnd[0] == TEST_UNIT_READY)
 990                transferred = 0;
 991
 992        if (srb->sc_data_direction == SCSI_DATA_WRITE) {
 993
 994                result = usbat_rw_block_test(us, USBAT_ATA, 
 995                        registers, data, 19,
 996                        0x10, 0x17, 0xFD, 0x30,
 997                        SCSI_DATA_WRITE,
 998                        srb->request_buffer, 
 999                        len, srb->use_sg, 10);
1000
1001                if (result == USB_STOR_TRANSPORT_GOOD) {
1002                        transferred += len;
1003                        US_DEBUGP("Wrote %08X bytes\n", transferred);
1004                }
1005
1006                return result;
1007
1008        } else if (srb->cmnd[0] == READ_10 ||
1009                   srb->cmnd[0] == GPCMD_READ_CD) {
1010
1011                return usbat_handle_read10(us, registers, data, srb);
1012
1013        }
1014
1015        if (len > 0xFFFF) {
1016                US_DEBUGP("Error: len = %08X... what do I do now?\n",
1017                        len);
1018                return USB_STOR_TRANSPORT_ERROR;
1019        }
1020
1021        if ( (result = usbat_multiple_write(us, 
1022                        USBAT_ATA,
1023                        registers, data, 7)) != USB_STOR_TRANSPORT_GOOD) {
1024                return result;
1025        }
1026
1027        // Write the 12-byte command header.
1028
1029        // If the command is BLANK then set the timer for 75 minutes.
1030        // Otherwise set it for 10 minutes.
1031
1032        // NOTE: THE 8200 DOCUMENTATION STATES THAT BLANKING A CDRW
1033        // AT SPEED 4 IS UNRELIABLE!!!
1034
1035        if ( (result = usbat_write_block(us, 
1036                        USBAT_ATA, 0x10, srb->cmnd, 12, 0,
1037                        srb->cmnd[0]==GPCMD_BLANK ? 75 : 10)) !=
1038                                USB_STOR_TRANSPORT_GOOD) {
1039                return result;
1040        }
1041
1042        // If there is response data to be read in 
1043        // then do it here.
1044
1045        if (len != 0 && (srb->sc_data_direction == SCSI_DATA_READ)) {
1046
1047                // How many bytes to read in? Check cylL register
1048
1049                if ( (result = usbat_read(us, USBAT_ATA, 0x14, &status)) != 
1050                    USB_STOR_TRANSPORT_GOOD) {
1051                        return result;
1052                }
1053
1054                if (len>0xFF) { // need to read cylH also
1055                        len = status;
1056                        if ( (result = usbat_read(us, USBAT_ATA, 0x15,
1057                                &status)) !=
1058                                    USB_STOR_TRANSPORT_GOOD) {
1059                                return result;
1060                        }
1061                        len += ((unsigned int)status)<<8;
1062                }
1063                else
1064                        len = status;
1065
1066
1067                result = usbat_read_block(us, USBAT_ATA, 0x10, 
1068                        srb->request_buffer, len, srb->use_sg);
1069
1070                /* Debug-print the first 32 bytes of the transfer */
1071
1072                if (!srb->use_sg) {
1073                        string[0] = 0;
1074                        for (i=0; i<len && i<32; i++) {
1075                                sprintf(string+strlen(string), "%02X ",
1076                                  ((unsigned char *)srb->request_buffer)[i]);
1077                                if ((i%16)==15) {
1078                                        US_DEBUGP("%s\n", string);
1079                                        string[0] = 0;
1080                                }
1081                        }
1082                        if (string[0]!=0)
1083                                US_DEBUGP("%s\n", string);
1084                }
1085        }
1086
1087        return result;
1088}
1089
1090
1091
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.