root/dev/ic/wdc.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. wdc_log
  2. wdc_get_log
  3. wdc_default_read_reg
  4. wdc_default_write_reg
  5. wdc_default_lba48_write_reg
  6. wdc_default_read_raw_multi_2
  7. wdc_default_write_raw_multi_2
  8. wdc_default_write_raw_multi_4
  9. wdc_default_read_raw_multi_4
  10. wdprint
  11. wdc_disable_intr
  12. wdc_enable_intr
  13. wdc_set_drive
  14. wdc_floating_bus
  15. wdc_preata_drive
  16. wdc_ata_present
  17. wdcprobe
  18. wdcactivate
  19. wdcattach
  20. wdcstart
  21. wdcdetach
  22. wdcintr
  23. wdc_reset_channel
  24. wdcreset
  25. wdc_do_reset
  26. __wdcwait_reset
  27. wdc_wait_for_status
  28. wdc_dmawait
  29. wdctimeout
  30. wdc_probe_caps
  31. wdc_output_bytes
  32. wdc_input_bytes
  33. wdc_print_caps
  34. wdc_print_current_modes
  35. wdc_downgrade_mode
  36. wdc_exec_command
  37. __wdccommand_start
  38. __wdccommand_intr
  39. __wdccommand_done
  40. wdccommand
  41. wdccommandext
  42. wdccommandshort
  43. wdc_exec_xfer
  44. wdc_get_xfer
  45. wdc_free_xfer
  46. wdc_kill_pending
  47. __wdcerror
  48. wdcbit_bucket
  49. LIST_HEAD
  50. wdc_ioctl_free
  51. wdc_ioctl_find
  52. wdc_ioctl_strategy
  53. wdc_ioctl

    1 /*      $OpenBSD: wdc.c,v 1.96 2007/05/08 16:07:03 deraadt Exp $     */
    2 /*      $NetBSD: wdc.c,v 1.68 1999/06/23 19:00:17 bouyer Exp $ */
    3 
    4 
    5 /*
    6  * Copyright (c) 1998, 2001 Manuel Bouyer.  All rights reserved.
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  * 3. All advertising materials mentioning features or use of this software
   17  *    must display the following acknowledgement:
   18  *  This product includes software developed by Manuel Bouyer.
   19  * 4. The name of the author may not be used to endorse or promote products
   20  *    derived from this software without specific prior written permission.
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   32  */
   33 
   34 /*-
   35  * Copyright (c) 1998 The NetBSD Foundation, Inc.
   36  * All rights reserved.
   37  *
   38  * This code is derived from software contributed to The NetBSD Foundation
   39  * by Charles M. Hannum, by Onno van der Linden and by Manuel Bouyer.
   40  *
   41  * Redistribution and use in source and binary forms, with or without
   42  * modification, are permitted provided that the following conditions
   43  * are met:
   44  * 1. Redistributions of source code must retain the above copyright
   45  *    notice, this list of conditions and the following disclaimer.
   46  * 2. Redistributions in binary form must reproduce the above copyright
   47  *    notice, this list of conditions and the following disclaimer in the
   48  *    documentation and/or other materials provided with the distribution.
   49  * 3. All advertising materials mentioning features or use of this software
   50  *    must display the following acknowledgement:
   51  *        This product includes software developed by the NetBSD
   52  *        Foundation, Inc. and its contributors.
   53  * 4. Neither the name of The NetBSD Foundation nor the names of its
   54  *    contributors may be used to endorse or promote products derived
   55  *    from this software without specific prior written permission.
   56  *
   57  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
   58  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   59  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   60  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
   61  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   62  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   63  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   64  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   65  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   66  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   67  * POSSIBILITY OF SUCH DAMAGE.
   68  */
   69 
   70 #include <sys/param.h>
   71 #include <sys/systm.h>
   72 #include <sys/kernel.h>
   73 #include <sys/conf.h>
   74 #include <sys/buf.h>
   75 #include <sys/device.h>
   76 #include <sys/malloc.h>
   77 #include <sys/syslog.h>
   78 #include <sys/proc.h>
   79 #include <sys/pool.h>
   80 #include <uvm/uvm_extern.h>
   81 
   82 #include <machine/intr.h>
   83 #include <machine/bus.h>
   84 
   85 #include <dev/ata/atavar.h>
   86 #include <dev/ata/atareg.h>
   87 #include <dev/ic/wdcreg.h>
   88 #include <dev/ic/wdcvar.h>
   89 #include <dev/ic/wdcevent.h>
   90 
   91 #include "atapiscsi.h"
   92 
   93 #define WDCDELAY  100 /* 100 microseconds */
   94 #define WDCNDELAY_RST (WDC_RESET_WAIT * 1000 / WDCDELAY)
   95 #if 0
   96 /* If you enable this, it will report any delays more than WDCDELAY * N long. */
   97 #define WDCNDELAY_DEBUG 50
   98 #endif /* 0 */
   99 
  100 struct pool wdc_xfer_pool;
  101 
  102 void  __wdcerror(struct channel_softc *, char *);
  103 int   __wdcwait_reset(struct channel_softc *, int);
  104 void  __wdccommand_done(struct channel_softc *, struct wdc_xfer *);
  105 void  __wdccommand_start(struct channel_softc *, struct wdc_xfer *);
  106 int   __wdccommand_intr(struct channel_softc *, struct wdc_xfer *, int);
  107 int   wdprint(void *, const char *);
  108 void  wdc_kill_pending(struct channel_softc *);
  109 
  110 #define DEBUG_INTR    0x01
  111 #define DEBUG_XFERS   0x02
  112 #define DEBUG_STATUS  0x04
  113 #define DEBUG_FUNCS   0x08
  114 #define DEBUG_PROBE   0x10
  115 #define DEBUG_STATUSX 0x20
  116 #define DEBUG_SDRIVE  0x40
  117 #define DEBUG_DETACH  0x80
  118 
  119 #ifdef WDCDEBUG
  120 #ifndef WDCDEBUG_MASK
  121 #define WDCDEBUG_MASK 0x00
  122 #endif
  123 int wdcdebug_mask = WDCDEBUG_MASK;
  124 int wdc_nxfer = 0;
  125 #define WDCDEBUG_PRINT(args, level) do {        \
  126         if ((wdcdebug_mask & (level)) != 0)     \
  127                 printf args;                    \
  128 } while (0)
  129 #else
  130 #define WDCDEBUG_PRINT(args, level)
  131 #endif /* WDCDEBUG */
  132 
  133 int at_poll = AT_POLL;
  134 
  135 int wdc_floating_bus(struct channel_softc *, int);
  136 int wdc_preata_drive(struct channel_softc *, int);
  137 int wdc_ata_present(struct channel_softc *, int);
  138 
  139 struct channel_softc_vtbl wdc_default_vtbl = {
  140         wdc_default_read_reg,
  141         wdc_default_write_reg,
  142         wdc_default_lba48_write_reg,
  143         wdc_default_read_raw_multi_2,
  144         wdc_default_write_raw_multi_2,
  145         wdc_default_read_raw_multi_4,
  146         wdc_default_write_raw_multi_4
  147 };
  148 
  149 static char *wdc_log_buf = NULL;
  150 static unsigned int wdc_tail = 0;
  151 static unsigned int wdc_head = 0;
  152 static unsigned int wdc_log_cap = 16 * 1024;
  153 static int chp_idx = 1;
  154 
  155 void
  156 wdc_log(struct channel_softc *chp, enum wdcevent_type type,
  157     unsigned int size, char val[])
  158 {
  159         unsigned int request_size;
  160         char *ptr;
  161         int log_size;
  162         unsigned int head = wdc_head;
  163         unsigned int tail = wdc_tail;
  164 
  165 #ifdef DIAGNOSTIC
  166         if (head < 0 || head > wdc_log_cap ||
  167             tail < 0 || tail > wdc_log_cap) {
  168                 printf ("wdc_log: head %x wdc_tail %x\n", head,
  169                     tail);
  170                 return;
  171         }
  172 
  173         if (size > wdc_log_cap / 2) {
  174                 printf ("wdc_log: type %d size %x\n", type, size);
  175                 return;
  176         }
  177 #endif
  178 
  179         if (wdc_log_buf == NULL) {
  180                 wdc_log_buf = malloc(wdc_log_cap, M_DEVBUF, M_NOWAIT);
  181                 if (wdc_log_buf == NULL)
  182                         return;
  183         }
  184         if (chp->ch_log_idx == 0)
  185                 chp->ch_log_idx = chp_idx++;
  186 
  187         request_size = size + 2;
  188 
  189         /* Check how many bytes are left */
  190         log_size = head - tail;
  191         if (log_size < 0) log_size += wdc_log_cap;
  192 
  193         if (log_size + request_size >= wdc_log_cap) {
  194                 int nb = 0; 
  195                 int rec_size;
  196 
  197                 while (nb <= (request_size * 2)) {
  198                         if (wdc_log_buf[tail] == 0)
  199                                 rec_size = 1;
  200                         else
  201                                 rec_size = (wdc_log_buf[tail + 1] & 0x1f) + 2;
  202                         tail = (tail + rec_size) % wdc_log_cap;
  203                         nb += rec_size;
  204                 }
  205         }
  206 
  207         /* Avoid wrapping in the middle of a request */
  208         if (head + request_size >= wdc_log_cap) {
  209                 memset(&wdc_log_buf[head], 0, wdc_log_cap - head);
  210                 head = 0;
  211         }
  212 
  213         ptr = &wdc_log_buf[head];
  214         *ptr++ = type & 0xff;
  215         *ptr++ = ((chp->ch_log_idx & 0x7) << 5) | (size & 0x1f);
  216         memcpy(ptr, val, size);
  217 
  218         wdc_head = (head + request_size) % wdc_log_cap;
  219         wdc_tail = tail;
  220 }
  221 
  222 char *wdc_get_log(unsigned int *, unsigned int *);
  223 
  224 char *
  225 wdc_get_log(unsigned int * size, unsigned int *left)
  226 {
  227         int  log_size;
  228         char *retbuf = NULL;
  229         int  nb, tocopy;
  230         int  s;
  231         unsigned int head = wdc_head;
  232         unsigned int tail = wdc_tail;
  233 
  234         s = splbio();
  235 
  236         log_size = (head - tail);
  237         if (left != NULL)
  238                 *left = 0;
  239 
  240         if (log_size < 0)
  241                 log_size += wdc_log_cap;
  242 
  243         tocopy = log_size;
  244         if ((u_int)tocopy > *size)
  245                 tocopy = *size;
  246 
  247         if (wdc_log_buf == NULL) {
  248                 *size = 0;
  249                 *left = 0;
  250                 goto out;
  251         }
  252 
  253 #ifdef DIAGNOSTIC
  254         if (head < 0 || head > wdc_log_cap ||
  255             tail < 0 || tail > wdc_log_cap) {
  256                 printf ("wdc_log: head %x tail %x\n", head,
  257                     tail);
  258                 *size = 0;
  259                 *left = 0;
  260                 goto out;
  261         }
  262 #endif
  263 
  264         retbuf = malloc(tocopy, M_TEMP, M_NOWAIT);
  265         if (retbuf == NULL) {
  266                 *size = 0;
  267                 *left = log_size;
  268                 goto out;
  269         }
  270 
  271         nb = 0;
  272         for (;;) {
  273                 int rec_size;
  274 
  275                 if (wdc_log_buf[tail] == 0)
  276                         rec_size = 1;
  277                 else
  278                         rec_size = (wdc_log_buf[tail + 1] & 0x1f) + 2;
  279 
  280                 if ((nb + rec_size) >= tocopy)
  281                         break;
  282 
  283                 memcpy(&retbuf[nb], &wdc_log_buf[tail], rec_size);
  284                 tail = (tail + rec_size) % wdc_log_cap;
  285                 nb += rec_size;
  286         }
  287 
  288         wdc_tail = tail;
  289         *size = nb;
  290         *left = log_size - nb;
  291 
  292  out:
  293         splx(s);
  294         return (retbuf);
  295 }
  296 
  297 
  298 u_int8_t
  299 wdc_default_read_reg(chp, reg)
  300         struct channel_softc *chp;
  301         enum wdc_regs reg;
  302 {
  303 #ifdef DIAGNOSTIC
  304         if (reg & _WDC_WRONLY) {
  305                 printf ("wdc_default_read_reg: reading from a write-only register %d\n", reg);
  306         }
  307 #endif /* DIAGNOSTIC */
  308 
  309         if (reg & _WDC_AUX)
  310                 return (bus_space_read_1(chp->ctl_iot, chp->ctl_ioh,
  311                     reg & _WDC_REGMASK));
  312         else
  313                 return (bus_space_read_1(chp->cmd_iot, chp->cmd_ioh,
  314                     reg & _WDC_REGMASK));
  315 }
  316 
  317 void
  318 wdc_default_write_reg(chp, reg, val)
  319         struct channel_softc *chp;
  320         enum wdc_regs reg;
  321         u_int8_t val;
  322 {
  323 #ifdef DIAGNOSTIC
  324         if (reg & _WDC_RDONLY) {
  325                 printf ("wdc_default_write_reg: writing to a read-only register %d\n", reg);
  326         }
  327 #endif /* DIAGNOSTIC */
  328 
  329         if (reg & _WDC_AUX)
  330                 bus_space_write_1(chp->ctl_iot, chp->ctl_ioh,
  331                     reg & _WDC_REGMASK, val);
  332         else
  333                 bus_space_write_1(chp->cmd_iot, chp->cmd_ioh,
  334                     reg & _WDC_REGMASK, val);
  335 }
  336 
  337 void
  338 wdc_default_lba48_write_reg(chp, reg, val)
  339         struct channel_softc *chp;
  340         enum wdc_regs reg;
  341         u_int16_t val;
  342 {
  343         /* All registers are two byte deep FIFOs. */
  344         CHP_WRITE_REG(chp, reg, val >> 8);
  345         CHP_WRITE_REG(chp, reg, val);
  346 }
  347 
  348 void
  349 wdc_default_read_raw_multi_2(chp, data, nbytes)
  350         struct channel_softc *chp;
  351         void *data;
  352         unsigned int nbytes;
  353 {
  354         if (data == NULL) {
  355                 unsigned int i;
  356 
  357                 for (i = 0; i < nbytes; i += 2) {
  358                         bus_space_read_2(chp->cmd_iot, chp->cmd_ioh, 0);
  359                 }
  360 
  361                 return;
  362         }
  363 
  364         bus_space_read_raw_multi_2(chp->cmd_iot, chp->cmd_ioh, 0,
  365             data, nbytes);
  366 }
  367 
  368 
  369 void
  370 wdc_default_write_raw_multi_2(chp, data, nbytes)
  371         struct channel_softc *chp;
  372         void *data;
  373         unsigned int nbytes;
  374 {
  375         if (data == NULL) {
  376                 unsigned int i;
  377 
  378                 for (i = 0; i < nbytes; i += 2) {
  379                         bus_space_write_2(chp->cmd_iot, chp->cmd_ioh, 0, 0);
  380                 }
  381 
  382                 return;
  383         }
  384 
  385         bus_space_write_raw_multi_2(chp->cmd_iot, chp->cmd_ioh, 0,
  386             data, nbytes);
  387 }
  388 
  389 
  390 void
  391 wdc_default_write_raw_multi_4(chp, data, nbytes)
  392         struct channel_softc *chp;
  393         void *data;
  394         unsigned int nbytes;
  395 {
  396         if (data == NULL) {
  397                 unsigned int i;
  398 
  399                 for (i = 0; i < nbytes; i += 4) {
  400                         bus_space_write_4(chp->cmd_iot, chp->cmd_ioh, 0, 0);
  401                 }
  402 
  403                 return;
  404         }
  405 
  406         bus_space_write_raw_multi_4(chp->cmd_iot, chp->cmd_ioh, 0,
  407             data, nbytes);
  408 }
  409 
  410 
  411 void
  412 wdc_default_read_raw_multi_4(chp, data, nbytes)
  413         struct channel_softc *chp;
  414         void *data;
  415         unsigned int nbytes;
  416 {
  417         if (data == NULL) {
  418                 unsigned int i;
  419 
  420                 for (i = 0; i < nbytes; i += 4) {
  421                         bus_space_read_4(chp->cmd_iot, chp->cmd_ioh, 0);
  422                 }
  423 
  424                 return;
  425         }
  426 
  427         bus_space_read_raw_multi_4(chp->cmd_iot, chp->cmd_ioh, 0,
  428             data, nbytes);
  429 }
  430 
  431 
  432 int
  433 wdprint(aux, pnp)
  434         void *aux;
  435         const char *pnp;
  436 {
  437         struct ata_atapi_attach *aa_link = aux;
  438         if (pnp)
  439                 printf("drive at %s", pnp);
  440         printf(" channel %d drive %d", aa_link->aa_channel,
  441             aa_link->aa_drv_data->drive);
  442         return (UNCONF);
  443 }
  444 
  445 void
  446 wdc_disable_intr(chp)
  447         struct channel_softc *chp;
  448 {
  449         CHP_WRITE_REG(chp, wdr_ctlr, WDCTL_IDS);
  450 }
  451 
  452 void
  453 wdc_enable_intr(chp)
  454         struct channel_softc *chp;
  455 {
  456         CHP_WRITE_REG(chp, wdr_ctlr, WDCTL_4BIT);
  457 }
  458 
  459 void
  460 wdc_set_drive(struct channel_softc *chp, int drive)
  461 {
  462         CHP_WRITE_REG(chp, wdr_sdh, (drive << 4) | WDSD_IBM);
  463         WDC_LOG_SET_DRIVE(chp, drive);
  464 }
  465 
  466 int
  467 wdc_floating_bus(chp, drive)
  468         struct channel_softc *chp;
  469         int drive;
  470 
  471 {
  472         u_int8_t cumulative_status, status;
  473         int      iter;
  474 
  475         wdc_set_drive(chp, drive);
  476         delay(10);
  477 
  478         /* Stolen from Phoenix BIOS Drive Autotyping document */
  479         cumulative_status = 0;
  480         for (iter = 0; iter < 100; iter++) {
  481                 CHP_WRITE_REG(chp, wdr_seccnt, 0x7f);
  482                 delay (1);
  483 
  484                 status = CHP_READ_REG(chp, wdr_status);
  485 
  486                 /* The other bits are meaningless if BSY is set */
  487                 if (status & WDCS_BSY)
  488                         continue;
  489 
  490                 cumulative_status |= status;
  491 
  492 #define BAD_BIT_COMBO  (WDCS_DRDY | WDCS_DSC | WDCS_DRQ | WDCS_ERR)
  493                 if ((cumulative_status & BAD_BIT_COMBO) == BAD_BIT_COMBO)
  494                         return 1;
  495         }
  496 
  497 
  498         return 0;
  499 }
  500 
  501 
  502 int
  503 wdc_preata_drive(chp, drive)
  504         struct channel_softc *chp;
  505         int drive;
  506 
  507 {
  508         if (wdc_floating_bus(chp, drive)) {
  509                 WDCDEBUG_PRINT(("%s:%d:%d: floating bus detected\n",
  510                     chp->wdc->sc_dev.dv_xname,
  511                     chp->channel, drive), DEBUG_PROBE);
  512                 return 0;
  513         }
  514 
  515         wdc_set_drive(chp, drive);
  516         delay(100);
  517         if (wdcwait(chp, WDCS_DRDY | WDCS_DRQ, WDCS_DRDY, 10000) != 0) {
  518                 WDCDEBUG_PRINT(("%s:%d:%d: not ready\n",
  519                     chp->wdc->sc_dev.dv_xname,
  520                     chp->channel, drive), DEBUG_PROBE);
  521                 return 0;
  522         }
  523 
  524         CHP_WRITE_REG(chp, wdr_command, WDCC_RECAL);
  525         WDC_LOG_ATA_CMDSHORT(chp, WDCC_RECAL);
  526         if (wdcwait(chp, WDCS_DRDY | WDCS_DRQ, WDCS_DRDY, 10000) != 0) {
  527                 WDCDEBUG_PRINT(("%s:%d:%d: WDCC_RECAL failed\n",
  528                     chp->wdc->sc_dev.dv_xname,
  529                     chp->channel, drive), DEBUG_PROBE);
  530                 return 0;
  531         }
  532 
  533         return 1;
  534 }
  535 
  536 int
  537 wdc_ata_present(chp, drive)
  538         struct channel_softc *chp;
  539         int drive;
  540 {
  541         int time_to_done;
  542         int retry_cnt = 0;
  543 
  544         wdc_set_drive(chp, drive);
  545         delay(10);
  546 
  547 retry:
  548         /*
  549            You're actually supposed to wait up to 10 seconds
  550            for DRDY. However, as a practical matter, most
  551            drives assert DRDY very quickly after dropping BSY.
  552 
  553            The 10 seconds wait is sub-optimal because, according
  554            to the ATA standard, the master should reply with 00
  555            for any reads to a non-existent slave.
  556         */
  557         time_to_done = wdc_wait_for_status(chp,
  558             (WDCS_DRDY | WDCS_DSC | WDCS_DRQ),
  559             (WDCS_DRDY | WDCS_DSC), 1000);
  560         if (time_to_done == -1) {
  561                 if (retry_cnt == 0 && chp->ch_status == 0x00) {
  562                         /* At least one flash card needs to be kicked */
  563                         wdccommandshort(chp, drive, WDCC_CHECK_PWR);
  564                         retry_cnt++;
  565                         goto retry;
  566                 }
  567                 WDCDEBUG_PRINT(("%s:%d:%d: DRDY test timed out with status"
  568                     " %02x\n",
  569                     chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe",
  570                     chp->channel, drive, chp->ch_status),
  571                     DEBUG_PROBE);
  572                 return 0;
  573         }
  574 
  575         if ((chp->ch_status & 0xfc) != (WDCS_DRDY | WDCS_DSC)) {
  576                 WDCDEBUG_PRINT(("%s:%d:%d: status test for 0x50 failed with"
  577                     " %02x\n",
  578                     chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe",
  579                     chp->channel, drive, chp->ch_status),
  580                     DEBUG_PROBE);
  581 
  582                 return 0;
  583         }
  584 
  585         WDCDEBUG_PRINT(("%s:%d:%d: waiting for ready %d msec\n",
  586             chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe",
  587             chp->channel, drive, time_to_done), DEBUG_PROBE);
  588 
  589         /*
  590          * Test register writability
  591          */
  592         CHP_WRITE_REG(chp, wdr_cyl_lo, 0xaa);
  593         CHP_WRITE_REG(chp, wdr_cyl_hi, 0x55);
  594         CHP_WRITE_REG(chp, wdr_seccnt, 0xff);
  595         DELAY(10);
  596 
  597         if (CHP_READ_REG(chp, wdr_cyl_lo) != 0xaa &&
  598             CHP_READ_REG(chp, wdr_cyl_hi) != 0x55) {
  599                 WDCDEBUG_PRINT(("%s:%d:%d: register writability failed\n",
  600                     chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe",
  601                     chp->channel, drive), DEBUG_PROBE);
  602                 return 0;
  603         }
  604 
  605         return 1;
  606 }
  607 
  608 
  609 /*
  610  * Test to see controller with at least one attached drive is there.
  611  * Returns a bit for each possible drive found (0x01 for drive 0,
  612  * 0x02 for drive 1).
  613  * Logic:
  614  * - If a status register is at 0x7f or 0xff, assume there is no drive here
  615  *   (ISA has pull-up resistors).  Similarly if the status register has
  616  *   the value we last wrote to the bus (for IDE interfaces without pullups).
  617  *   If no drive at all -> return.
  618  * - reset the controller, wait for it to complete (may take up to 31s !).
  619  *   If timeout -> return.
  620  * - test ATA/ATAPI signatures. If at last one drive found -> return.
  621  * - try an ATA command on the master.
  622  */
  623 
  624 int
  625 wdcprobe(chp)
  626         struct channel_softc *chp;
  627 {
  628         u_int8_t st0, st1, sc, sn, cl, ch;
  629         u_int8_t ret_value = 0x03;
  630         u_int8_t drive;
  631 #ifdef WDCDEBUG
  632         int savedmask = wdcdebug_mask;
  633 #endif
  634 
  635         if (chp->_vtbl == 0) {
  636                 int s = splbio();
  637                 chp->_vtbl = &wdc_default_vtbl;
  638                 splx(s);
  639         }
  640 
  641 #ifdef WDCDEBUG
  642         if ((chp->ch_flags & WDCF_VERBOSE_PROBE) ||
  643             (chp->wdc &&
  644             (chp->wdc->sc_dev.dv_cfdata->cf_flags & WDC_OPTION_PROBE_VERBOSE)))
  645                 wdcdebug_mask |= DEBUG_PROBE;
  646 #endif /* WDCDEBUG */
  647 
  648         if (chp->wdc == NULL ||
  649             (chp->wdc->cap & WDC_CAPABILITY_NO_EXTRA_RESETS) == 0) {
  650                 /* Sample the statuses of drive 0 and 1 into st0 and st1 */
  651                 wdc_set_drive(chp, 0);
  652                 delay(10);
  653                 st0 = CHP_READ_REG(chp, wdr_status);
  654                 WDC_LOG_STATUS(chp, st0);
  655                 wdc_set_drive(chp, 1);
  656                 delay(10);
  657                 st1 = CHP_READ_REG(chp, wdr_status);
  658                 WDC_LOG_STATUS(chp, st1);
  659 
  660                 WDCDEBUG_PRINT(("%s:%d: before reset, st0=0x%b, st1=0x%b\n",
  661                     chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe",
  662                     chp->channel, st0, WDCS_BITS, st1, WDCS_BITS),
  663                     DEBUG_PROBE);
  664 
  665                 if (st0 == 0xff || st0 == WDSD_IBM)
  666                         ret_value &= ~0x01;
  667                 if (st1 == 0xff || st1 == (WDSD_IBM | 0x10))
  668                         ret_value &= ~0x02;
  669                 if (ret_value == 0)
  670                         return 0;
  671         }
  672 
  673         /* reset the channel */
  674         wdc_do_reset(chp);
  675 
  676         ret_value = __wdcwait_reset(chp, ret_value);
  677         WDCDEBUG_PRINT(("%s:%d: after reset, ret_value=0x%d\n",
  678             chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe", chp->channel,
  679             ret_value), DEBUG_PROBE);
  680 
  681         if (ret_value == 0)
  682                 return 0;
  683 
  684         /*
  685          * Use signatures to find potential ATAPI drives
  686          */
  687         for (drive = 0; drive < 2; drive++) {
  688                 if ((ret_value & (0x01 << drive)) == 0)
  689                         continue;
  690                 wdc_set_drive(chp, drive);
  691                 delay(10);
  692                 /* Save registers contents */
  693                 st0 = CHP_READ_REG(chp, wdr_status);
  694                 sc = CHP_READ_REG(chp, wdr_seccnt);
  695                 sn = CHP_READ_REG(chp, wdr_sector);
  696                 cl = CHP_READ_REG(chp, wdr_cyl_lo);
  697                 ch = CHP_READ_REG(chp, wdr_cyl_hi);
  698                 WDC_LOG_REG(chp, wdr_cyl_lo, (ch << 8) | cl);
  699 
  700                 WDCDEBUG_PRINT(("%s:%d:%d: after reset, st=0x%b, sc=0x%x"
  701                     " sn=0x%x cl=0x%x ch=0x%x\n",
  702                     chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe",
  703                     chp->channel, drive, st0, WDCS_BITS, sc, sn, cl, ch),
  704                     DEBUG_PROBE);
  705                 /*
  706                  * This is a simplification of the test in the ATAPI
  707                  * spec since not all drives seem to set the other regs
  708                  * correctly.
  709                  */
  710                 if (cl == 0x14 && ch == 0xeb)
  711                         chp->ch_drive[drive].drive_flags |= DRIVE_ATAPI;
  712         }
  713 
  714         /*
  715          * Detect ATA drives by poking around the registers
  716          */
  717         for (drive = 0; drive < 2; drive++) {
  718                 if ((ret_value & (0x01 << drive)) == 0)
  719                         continue;
  720                 if (chp->ch_drive[drive].drive_flags & DRIVE_ATAPI)
  721                         continue;
  722 
  723                 wdc_disable_intr(chp);
  724                 /* ATA detect */
  725                 if (wdc_ata_present(chp, drive)) {
  726                         chp->ch_drive[drive].drive_flags |= DRIVE_ATA;
  727                         if (chp->wdc == NULL ||
  728                             (chp->wdc->cap & WDC_CAPABILITY_PREATA) != 0)
  729                                 chp->ch_drive[drive].drive_flags |= DRIVE_OLD;
  730                 } else {
  731                         ret_value &= ~(1 << drive);
  732                 }
  733                 wdc_enable_intr(chp);
  734         }
  735 
  736 #ifdef WDCDEBUG
  737         wdcdebug_mask = savedmask;
  738 #endif
  739         return (ret_value);
  740 }
  741 
  742 /*
  743  * Call activate routine of underlying devices.
  744  */
  745 int
  746 wdcactivate(self, act)
  747         struct device *self;
  748         enum devact act;
  749 {
  750         int error = 0;
  751         int s;
  752 
  753         s = splbio();
  754         config_activate_children(self, act);
  755         splx(s);
  756 
  757         return (error);
  758 }
  759 
  760 void
  761 wdcattach(chp)
  762         struct channel_softc *chp;
  763 {
  764         int channel_flags, ctrl_flags, i;
  765 #ifndef __OpenBSD__
  766         int error;
  767 #endif
  768         struct ata_atapi_attach aa_link;
  769         static int inited = 0;
  770 #ifdef WDCDEBUG
  771         int    savedmask = wdcdebug_mask;
  772 #endif
  773 
  774         if (!cold)
  775                 at_poll = AT_WAIT;
  776 
  777         if (chp->wdc->reset == NULL)
  778                 chp->wdc->reset = wdc_do_reset;
  779 
  780         timeout_set(&chp->ch_timo, wdctimeout, chp);
  781 
  782 #ifndef __OpenBSD__
  783         if ((error = wdc_addref(chp)) != 0) {
  784                 printf("%s: unable to enable controller\n",
  785                     chp->wdc->sc_dev.dv_xname);
  786                 return;
  787         }
  788 #endif /* __OpenBSD__ */
  789         if (!chp->_vtbl)
  790                 chp->_vtbl = &wdc_default_vtbl;
  791 
  792         if (chp->wdc->drv_probe != NULL) {
  793                 chp->wdc->drv_probe(chp);
  794         } else {
  795                 if (wdcprobe(chp) == 0) {
  796                         /* If no drives, abort attach here. */
  797 #ifndef __OpenBSD__
  798                         wdc_delref(chp);
  799 #endif
  800                         return;
  801                 }
  802         }
  803 
  804         /* ATAPI drives need settling time. Give them 250ms */
  805         if ((chp->ch_drive[0].drive_flags & DRIVE_ATAPI) ||
  806             (chp->ch_drive[1].drive_flags & DRIVE_ATAPI)) {
  807                 delay(250 * 1000);
  808         }
  809 
  810 #ifdef WDCDEBUG
  811         if (chp->wdc->sc_dev.dv_cfdata->cf_flags & WDC_OPTION_PROBE_VERBOSE)
  812                 wdcdebug_mask |= DEBUG_PROBE;
  813 
  814         if ((chp->ch_drive[0].drive_flags & DRIVE_ATAPI) ||
  815             (chp->ch_drive[1].drive_flags & DRIVE_ATAPI)) {
  816                 wdcdebug_mask = DEBUG_PROBE;
  817         }
  818 #endif /* WDCDEBUG */
  819 
  820         /* initialise global data */
  821         if (inited == 0) {
  822                 /* Initialize the wdc_xfer pool. */
  823                 pool_init(&wdc_xfer_pool, sizeof(struct wdc_xfer), 0,
  824                     0, 0, "wdcspl", NULL);
  825                 inited++;
  826         }
  827         TAILQ_INIT(&chp->ch_queue->sc_xfer);
  828 
  829         for (i = 0; i < 2; i++) {
  830                 struct ata_drive_datas *drvp = &chp->ch_drive[i];
  831 
  832                 drvp->chnl_softc = chp;
  833                 drvp->drive = i;
  834                 /* If controller can't do 16bit flag the drives as 32bit */
  835                 if ((chp->wdc->cap &
  836                     (WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32)) ==
  837                     WDC_CAPABILITY_DATA32)
  838                         drvp->drive_flags |= DRIVE_CAP32;
  839 
  840                 if ((drvp->drive_flags & DRIVE) == 0)
  841                         continue;
  842 
  843                 if (i == 1 && ((chp->ch_drive[0].drive_flags & DRIVE) == 0))
  844                         chp->ch_flags |= WDCF_ONESLAVE;
  845                 /*
  846                  * Wait a bit, some devices are weird just after a reset.
  847                  * Then issue a IDENTIFY command, to try to detect slave ghost.
  848                  */
  849                 delay(5000);
  850                 if (ata_get_params(&chp->ch_drive[i], at_poll, &drvp->id) ==
  851                     CMD_OK) {
  852                         /* If IDENTIFY succeeded, this is not an OLD ctrl */
  853                         drvp->drive_flags &= ~DRIVE_OLD;
  854                 } else {
  855                         bzero(&drvp->id, sizeof(struct ataparams));
  856                         drvp->drive_flags &=
  857                             ~(DRIVE_ATA | DRIVE_ATAPI);
  858                         WDCDEBUG_PRINT(("%s:%d:%d: IDENTIFY failed\n",
  859                             chp->wdc->sc_dev.dv_xname,
  860                             chp->channel, i), DEBUG_PROBE);
  861 
  862                         if ((drvp->drive_flags & DRIVE_OLD) &&
  863                             !wdc_preata_drive(chp, i))
  864                                 drvp->drive_flags &= ~DRIVE_OLD;
  865                 }
  866         }
  867         ctrl_flags = chp->wdc->sc_dev.dv_cfdata->cf_flags;
  868         channel_flags = (ctrl_flags >> (NBBY * chp->channel)) & 0xff;
  869 
  870         WDCDEBUG_PRINT(("wdcattach: ch_drive_flags 0x%x 0x%x\n",
  871             chp->ch_drive[0].drive_flags, chp->ch_drive[1].drive_flags),
  872             DEBUG_PROBE);
  873 
  874         /* If no drives, abort here */
  875         if ((chp->ch_drive[0].drive_flags & DRIVE) == 0 &&
  876             (chp->ch_drive[1].drive_flags & DRIVE) == 0)
  877                 goto exit;
  878 
  879         for (i = 0; i < 2; i++) {
  880                 if ((chp->ch_drive[i].drive_flags & DRIVE) == 0) {
  881                         continue;
  882                 }
  883                 bzero(&aa_link, sizeof(struct ata_atapi_attach));
  884                 if (chp->ch_drive[i].drive_flags & DRIVE_ATAPI)
  885                         aa_link.aa_type = T_ATAPI;
  886                 else
  887                         aa_link.aa_type = T_ATA;
  888                 aa_link.aa_channel = chp->channel;
  889                 aa_link.aa_openings = 1;
  890                 aa_link.aa_drv_data = &chp->ch_drive[i];
  891                 config_found(&chp->wdc->sc_dev, (void *)&aa_link, wdprint);
  892         }
  893 
  894         /*
  895          * reset drive_flags for unattached devices, reset state for attached
  896          *  ones
  897          */
  898         for (i = 0; i < 2; i++) {
  899                 if (chp->ch_drive[i].drive_name[0] == 0)
  900                         chp->ch_drive[i].drive_flags = 0;
  901         }
  902 
  903 #ifndef __OpenBSD__
  904         wdc_delref(chp);
  905 #endif
  906 
  907 exit:
  908 #ifdef WDCDEBUG
  909         wdcdebug_mask = savedmask;
  910 #endif
  911         return; /* for the ``exit'' label above */
  912 }
  913 
  914 /*
  915  * Start I/O on a controller, for the given channel.
  916  * The first xfer may be not for our channel if the channel queues
  917  * are shared.
  918  */
  919 void
  920 wdcstart(chp)
  921         struct channel_softc *chp;
  922 {
  923         struct wdc_xfer *xfer;
  924 
  925         splassert(IPL_BIO);
  926 
  927         /* is there a xfer ? */
  928         if ((xfer = TAILQ_FIRST(&chp->ch_queue->sc_xfer)) == NULL) {
  929                 return;
  930         }
  931 
  932         /* adjust chp, in case we have a shared queue */
  933         chp = xfer->chp;
  934 
  935         if ((chp->ch_flags & WDCF_ACTIVE) != 0 ) {
  936                 return; /* channel already active */
  937         }
  938 #ifdef DIAGNOSTIC
  939         if ((chp->ch_flags & WDCF_IRQ_WAIT) != 0)
  940                 panic("wdcstart: channel waiting for irq");
  941 #endif /* DIAGNOSTIC */
  942         if (chp->wdc->cap & WDC_CAPABILITY_HWLOCK)
  943                 if (!(chp->wdc->claim_hw)(chp, 0))
  944                         return;
  945 
  946         WDCDEBUG_PRINT(("wdcstart: xfer %p channel %d drive %d\n", xfer,
  947             chp->channel, xfer->drive), DEBUG_XFERS);
  948         chp->ch_flags |= WDCF_ACTIVE;
  949         if (chp->ch_drive[xfer->drive].drive_flags & DRIVE_RESET) {
  950                 chp->ch_drive[xfer->drive].drive_flags &= ~DRIVE_RESET;
  951                 chp->ch_drive[xfer->drive].state = 0;
  952         }
  953         xfer->c_start(chp, xfer);
  954 }
  955 
  956 int
  957 wdcdetach(chp, flags)
  958         struct channel_softc *chp;
  959         int flags;
  960 {
  961         int s, rv;
  962 
  963         s = splbio();
  964         wdc_kill_pending(chp);
  965 
  966         rv = config_detach_children((struct device *)chp->wdc, flags);
  967         splx(s);
  968 
  969         return (rv);
  970 }
  971 
  972 /*
  973  * Interrupt routine for the controller.  Acknowledge the interrupt, check for
  974  * errors on the current operation, mark it done if necessary, and start the
  975  * next request.  Also check for a partially done transfer, and continue with
  976  * the next chunk if so.
  977  */
  978 int
  979 wdcintr(arg)
  980         void *arg;
  981 {
  982         struct channel_softc *chp = arg;
  983         struct wdc_xfer *xfer;
  984         int ret;
  985 
  986         if ((chp->ch_flags & WDCF_IRQ_WAIT) == 0) {
  987                 /* Acknowledge interrupt by reading status */
  988                 if (chp->_vtbl == 0) {
  989                         bus_space_read_1(chp->cmd_iot, chp->cmd_ioh,
  990                             wdr_status & _WDC_REGMASK);
  991                 } else {
  992                         CHP_READ_REG(chp, wdr_status);
  993                 }
  994 
  995                 WDCDEBUG_PRINT(("wdcintr: inactive controller\n"), DEBUG_INTR);
  996                 return 0;
  997         }
  998 
  999         WDCDEBUG_PRINT(("wdcintr\n"), DEBUG_INTR);
 1000         xfer = TAILQ_FIRST(&chp->ch_queue->sc_xfer);
 1001         if (chp->ch_flags & WDCF_DMA_WAIT) {
 1002                 chp->wdc->dma_status =
 1003                     (*chp->wdc->dma_finish)(chp->wdc->dma_arg, chp->channel,
 1004                     xfer->drive, 0);
 1005                 if (chp->wdc->dma_status & WDC_DMAST_NOIRQ) {
 1006                         /* IRQ not for us, not detected by DMA engine */
 1007                         return 0;
 1008                 }
 1009                 chp->ch_flags &= ~WDCF_DMA_WAIT;
 1010         }
 1011         chp->ch_flags &= ~WDCF_IRQ_WAIT;
 1012         ret = xfer->c_intr(chp, xfer, 1);
 1013         if (ret == 0)   /* irq was not for us, still waiting for irq */
 1014                 chp->ch_flags |= WDCF_IRQ_WAIT;
 1015         return (ret);
 1016 }
 1017 
 1018 /* Put all disk in RESET state */
 1019 void wdc_reset_channel(drvp)
 1020         struct ata_drive_datas *drvp;
 1021 {
 1022         struct channel_softc *chp = drvp->chnl_softc;
 1023         int drive;
 1024         WDCDEBUG_PRINT(("ata_reset_channel %s:%d for drive %d\n",
 1025             chp->wdc->sc_dev.dv_xname, chp->channel, drvp->drive),
 1026             DEBUG_FUNCS);
 1027         (void) wdcreset(chp, VERBOSE);
 1028         for (drive = 0; drive < 2; drive++) {
 1029                 chp->ch_drive[drive].state = 0;
 1030         }
 1031 }
 1032 
 1033 int
 1034 wdcreset(chp, verb)
 1035         struct channel_softc *chp;
 1036         int verb;
 1037 {
 1038         int drv_mask1, drv_mask2;
 1039 
 1040         if (!chp->_vtbl)
 1041                 chp->_vtbl = &wdc_default_vtbl;
 1042 
 1043         chp->wdc->reset(chp);
 1044 
 1045         drv_mask1 = (chp->ch_drive[0].drive_flags & DRIVE) ? 0x01:0x00;
 1046         drv_mask1 |= (chp->ch_drive[1].drive_flags & DRIVE) ? 0x02:0x00;
 1047         drv_mask2 = __wdcwait_reset(chp, drv_mask1);
 1048         if (verb && drv_mask2 != drv_mask1) {
 1049                 printf("%s channel %d: reset failed for",
 1050                     chp->wdc->sc_dev.dv_xname, chp->channel);
 1051                 if ((drv_mask1 & 0x01) != 0 && (drv_mask2 & 0x01) == 0)
 1052                         printf(" drive 0");
 1053                 if ((drv_mask1 & 0x02) != 0 && (drv_mask2 & 0x02) == 0)
 1054                         printf(" drive 1");
 1055                 printf("\n");
 1056         }
 1057 
 1058         return (drv_mask1 != drv_mask2) ? 1 : 0;
 1059 }
 1060 
 1061 void
 1062 wdc_do_reset(struct channel_softc *chp)
 1063 {
 1064         wdc_set_drive(chp, 0);
 1065         DELAY(10);
 1066         CHP_WRITE_REG(chp, wdr_ctlr, WDCTL_4BIT | WDCTL_RST);
 1067         delay(10000);
 1068         CHP_WRITE_REG(chp, wdr_ctlr, WDCTL_4BIT);
 1069         delay(10000);
 1070 }
 1071 
 1072 int
 1073 __wdcwait_reset(chp, drv_mask)
 1074         struct channel_softc *chp;
 1075         int drv_mask;
 1076 {
 1077         int timeout;
 1078         u_int8_t st0, er0, st1, er1;
 1079 
 1080         /* wait for BSY to deassert */
 1081         for (timeout = 0; timeout < WDCNDELAY_RST; timeout++) {
 1082                 wdc_set_drive(chp, 0);
 1083                 delay(10);
 1084                 st0 = CHP_READ_REG(chp, wdr_status);
 1085                 er0 = CHP_READ_REG(chp, wdr_error);
 1086                 wdc_set_drive(chp, 1);
 1087                 delay(10);
 1088                 st1 = CHP_READ_REG(chp, wdr_status);
 1089                 er1 = CHP_READ_REG(chp, wdr_error);
 1090 
 1091                 if ((drv_mask & 0x01) == 0) {
 1092                         /* no master */
 1093                         if ((drv_mask & 0x02) != 0 && (st1 & WDCS_BSY) == 0) {
 1094                                 /* No master, slave is ready, it's done */
 1095                                 goto end;
 1096                         }
 1097                 } else if ((drv_mask & 0x02) == 0) {
 1098                         /* no slave */
 1099                         if ((drv_mask & 0x01) != 0 && (st0 & WDCS_BSY) == 0) {
 1100                                 /* No slave, master is ready, it's done */
 1101                                 goto end;
 1102                         }
 1103                 } else {
 1104                         /* Wait for both master and slave to be ready */
 1105                         if ((st0 & WDCS_BSY) == 0 && (st1 & WDCS_BSY) == 0) {
 1106                                 goto end;
 1107                         }
 1108                 }
 1109                 delay(WDCDELAY);
 1110         }
 1111         /* Reset timed out. Maybe it's because drv_mask was not right */
 1112         if (st0 & WDCS_BSY)
 1113                 drv_mask &= ~0x01;
 1114         if (st1 & WDCS_BSY)
 1115                 drv_mask &= ~0x02;
 1116 end:
 1117         WDCDEBUG_PRINT(("%s:%d: wdcwait_reset() end, st0=0x%b, er0=0x%x, "
 1118             "st1=0x%b, er1=0x%x, reset time=%d msec\n",
 1119             chp->wdc ? chp->wdc->sc_dev.dv_xname : "wdcprobe", chp->channel,
 1120             st0, WDCS_BITS, er0, st1, WDCS_BITS, er1,
 1121             timeout * WDCDELAY / 1000), DEBUG_PROBE);
 1122 
 1123         return drv_mask;
 1124 }
 1125 
 1126 /*
 1127  * Wait for a drive to be !BSY, and have mask in its status register.
 1128  * return -1 for a timeout after "timeout" ms.
 1129  */
 1130 int
 1131 wdc_wait_for_status(chp, mask, bits, timeout)
 1132         struct channel_softc *chp;
 1133         int mask, bits, timeout;
 1134 {
 1135         u_char status;
 1136         int time = 0;
 1137 
 1138         WDCDEBUG_PRINT(("wdcwait %s:%d\n", chp->wdc ?chp->wdc->sc_dev.dv_xname
 1139             :"none", chp->channel), DEBUG_STATUS);
 1140         chp->ch_error = 0;
 1141 
 1142         timeout = timeout * 1000 / WDCDELAY; /* delay uses microseconds */
 1143 
 1144         for (;;) {
 1145                 chp->ch_status = status = CHP_READ_REG(chp, wdr_status);
 1146                 WDC_LOG_STATUS(chp, chp->ch_status);
 1147 
 1148                 if (status == 0xff && (chp->ch_flags & WDCF_ONESLAVE)) {
 1149                         wdc_set_drive(chp, 1);
 1150                         chp->ch_status = status =
 1151                             CHP_READ_REG(chp, wdr_status);
 1152                         WDC_LOG_STATUS(chp, chp->ch_status);
 1153                 }
 1154                 if ((status & WDCS_BSY) == 0 && (status & mask) == bits)
 1155                         break;
 1156                 if (++time > timeout) {
 1157                         WDCDEBUG_PRINT(("wdcwait: timeout, status 0x%b "
 1158                             "error 0x%x\n", status, WDCS_BITS,
 1159                             CHP_READ_REG(chp, wdr_error)),
 1160                             DEBUG_STATUSX | DEBUG_STATUS);
 1161                         return -1;
 1162                 }
 1163                 delay(WDCDELAY);
 1164         }
 1165         if (status & WDCS_ERR) {
 1166                 chp->ch_error = CHP_READ_REG(chp, wdr_error);
 1167                 WDC_LOG_ERROR(chp, chp->ch_error);
 1168 
 1169                 WDCDEBUG_PRINT(("wdcwait: error %x\n", chp->ch_error),
 1170                                DEBUG_STATUSX | DEBUG_STATUS);
 1171         }
 1172 
 1173 #ifdef WDCNDELAY_DEBUG
 1174         /* After autoconfig, there should be no long delays. */
 1175         if (!cold && time > WDCNDELAY_DEBUG) {
 1176                 struct wdc_xfer *xfer = TAILQ_FIRST(&chp->ch_queue->sc_xfer);
 1177                 if (xfer == NULL)
 1178                         printf("%s channel %d: warning: busy-wait took %dus\n",
 1179                             chp->wdc->sc_dev.dv_xname, chp->channel,
 1180                             WDCDELAY * time);
 1181                 else
 1182                         printf("%s:%d:%d: warning: busy-wait took %dus\n",
 1183                             chp->wdc->sc_dev.dv_xname, chp->channel,
 1184                             xfer->drive,
 1185                             WDCDELAY * time);
 1186         }
 1187 #endif /* WDCNDELAY_DEBUG */
 1188         return time;
 1189 }
 1190 
 1191 /*
 1192  * Busy-wait for DMA to complete
 1193  */
 1194 int
 1195 wdc_dmawait(chp, xfer, timeout)
 1196         struct channel_softc *chp;
 1197         struct wdc_xfer *xfer;
 1198         int timeout;
 1199 {
 1200         int time;
 1201         for (time = 0; time < timeout * 1000 / WDCDELAY; time++) {
 1202                 chp->wdc->dma_status =
 1203                     (*chp->wdc->dma_finish)(chp->wdc->dma_arg,
 1204                     chp->channel, xfer->drive, 0);
 1205                 if ((chp->wdc->dma_status & WDC_DMAST_NOIRQ) == 0)
 1206                         return 0;
 1207                 delay(WDCDELAY);
 1208         }
 1209         /* timeout, force a DMA halt */
 1210         chp->wdc->dma_status = (*chp->wdc->dma_finish)(chp->wdc->dma_arg,
 1211             chp->channel, xfer->drive, 1);
 1212         return 1;
 1213 }
 1214 
 1215 void
 1216 wdctimeout(arg)
 1217         void *arg;
 1218 {
 1219         struct channel_softc *chp = (struct channel_softc *)arg;
 1220         struct wdc_xfer *xfer;
 1221         int s;
 1222 
 1223         WDCDEBUG_PRINT(("wdctimeout\n"), DEBUG_FUNCS);
 1224 
 1225         s = splbio();
 1226         xfer = TAILQ_FIRST(&chp->ch_queue->sc_xfer);
 1227 
 1228         /* Did we lose a race with the interrupt? */
 1229         if (xfer == NULL ||
 1230             !timeout_triggered(&chp->ch_timo)) {
 1231                 splx(s);
 1232                 return;
 1233         }
 1234         if ((chp->ch_flags & WDCF_IRQ_WAIT) != 0) {
 1235                 __wdcerror(chp, "timeout");
 1236                 printf("\ttype: %s\n", (xfer->c_flags & C_ATAPI) ?
 1237                     "atapi":"ata");
 1238                 printf("\tc_bcount: %d\n", xfer->c_bcount);
 1239                 printf("\tc_skip: %d\n", xfer->c_skip);
 1240                 if (chp->ch_flags & WDCF_DMA_WAIT) {
 1241                         chp->wdc->dma_status =
 1242                             (*chp->wdc->dma_finish)(chp->wdc->dma_arg,
 1243                             chp->channel, xfer->drive, 1);
 1244                         chp->ch_flags &= ~WDCF_DMA_WAIT;
 1245                 }
 1246                 /*
 1247                  * Call the interrupt routine. If we just missed and interrupt,
 1248                  * it will do what's needed. Else, it will take the needed
 1249                  * action (reset the device).
 1250                  */
 1251                 xfer->c_flags |= C_TIMEOU;
 1252                 chp->ch_flags &= ~WDCF_IRQ_WAIT;
 1253                 xfer->c_intr(chp, xfer, 1);
 1254         } else
 1255                 __wdcerror(chp, "missing untimeout");
 1256         splx(s);
 1257 }
 1258 
 1259 /*
 1260  * Probe drive's capabilities, for use by the controller later.
 1261  * Assumes drvp points to an existing drive.
 1262  * XXX this should be a controller-indep function
 1263  */
 1264 void
 1265 wdc_probe_caps(drvp, params)
 1266         struct ata_drive_datas *drvp;
 1267         struct ataparams *params;
 1268 {
 1269         struct channel_softc *chp = drvp->chnl_softc;
 1270         struct wdc_softc *wdc = chp->wdc;
 1271         int i, valid_mode_found;
 1272         int cf_flags = drvp->cf_flags;
 1273 
 1274         if ((wdc->cap & WDC_CAPABILITY_SATA) != 0 &&
 1275             (params->atap_sata_caps != 0x0000 &&
 1276             params->atap_sata_caps != 0xffff)) {
 1277                 WDCDEBUG_PRINT(("%s: atap_sata_caps=0x%x\n", __func__,
 1278                     params->atap_sata_caps), DEBUG_PROBE);
 1279 
 1280                 /* Skip ATA modes detection for native SATA drives */
 1281                 drvp->PIO_mode = drvp->PIO_cap = 4;
 1282                 drvp->DMA_mode = drvp->DMA_cap = 2;
 1283                 drvp->UDMA_mode = drvp->UDMA_cap = 5;
 1284                 drvp->drive_flags |= DRIVE_SATA | DRIVE_MODE | DRIVE_UDMA;
 1285                 drvp->ata_vers = 4;
 1286                 return;
 1287         }
 1288 
 1289         if ((wdc->cap & (WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32)) ==
 1290             (WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32)) {
 1291                 struct ataparams params2;
 1292 
 1293                 /*
 1294                  * Controller claims 16 and 32 bit transfers.
 1295                  * Re-do an IDENTIFY with 32-bit transfers,
 1296                  * and compare results.
 1297                  */
 1298                 drvp->drive_flags |= DRIVE_CAP32;
 1299                 ata_get_params(drvp, at_poll, &params2);
 1300                 if (bcmp(params, &params2, sizeof(struct ataparams)) != 0) {
 1301                         /* Not good. fall back to 16bits */
 1302                         drvp->drive_flags &= ~DRIVE_CAP32;
 1303                 }
 1304         }
 1305 #if 0 /* Some ultra-DMA drives claims to only support ATA-3. sigh */
 1306         if (params->atap_ata_major > 0x01 &&
 1307             params->atap_ata_major != 0xffff) {
 1308                 for (i = 14; i > 0; i--) {
 1309                         if (params->atap_ata_major & (1 << i)) {
 1310                                 printf("%sATA version %d\n", sep, i);
 1311                                 drvp->ata_vers = i;
 1312                                 break;
 1313                         }
 1314                 }
 1315         } else
 1316 #endif /* 0 */
 1317         /* Use PIO mode 3 as a default value for ATAPI devices */
 1318         if (drvp->drive_flags & DRIVE_ATAPI)
 1319                 drvp->PIO_mode = 3;
 1320 
 1321         WDCDEBUG_PRINT(("wdc_probe_caps: wdc_cap 0x%x cf_flags 0x%x\n",
 1322             wdc->cap, cf_flags), DEBUG_PROBE);
 1323 
 1324         valid_mode_found = 0;
 1325 
 1326         WDCDEBUG_PRINT(("%s: atap_oldpiotiming=%d\n", __func__,
 1327             params->atap_oldpiotiming), DEBUG_PROBE);
 1328         /*
 1329          * ATA-4 compliant devices contain PIO mode
 1330          * number in atap_oldpiotiming.
 1331          */
 1332         if (params->atap_oldpiotiming <= 2) {
 1333                 drvp->PIO_cap = params->atap_oldpiotiming;
 1334                 valid_mode_found = 1;
 1335                 drvp->drive_flags |= DRIVE_MODE;
 1336         } else if (params->atap_oldpiotiming > 180) {
 1337                 /*
 1338                  * ATA-2 compliant devices contain cycle
 1339                  * time in atap_oldpiotiming.
 1340                  * A device with a cycle time of 180ns
 1341                  * or less is at least PIO mode 3 and
 1342                  * should be reporting that in
 1343                  * atap_piomode_supp, so ignore it here.
 1344                  */
 1345                 if (params->atap_oldpiotiming <= 240) {
 1346                         drvp->PIO_cap = 2;
 1347                 } else {
 1348                         drvp->PIO_cap = 1;
 1349                 }
 1350                 valid_mode_found = 1;
 1351                 drvp->drive_flags |= DRIVE_MODE;
 1352         }
 1353         if (valid_mode_found)
 1354                 drvp->PIO_mode = drvp->PIO_cap;
 1355 
 1356         WDCDEBUG_PRINT(("%s: atap_extensions=0x%x, atap_piomode_supp=0x%x, "
 1357             "atap_dmamode_supp=0x%x, atap_udmamode_supp=0x%x\n",
 1358             __func__, params->atap_extensions, params->atap_piomode_supp,
 1359             params->atap_dmamode_supp, params->atap_udmamode_supp),
 1360             DEBUG_PROBE);
 1361 
 1362         /*
 1363          * It's not in the specs, but it seems that some drive
 1364          * returns 0xffff in atap_extensions when this field is invalid
 1365          */
 1366         if (params->atap_extensions != 0xffff &&
 1367             (params->atap_extensions & WDC_EXT_MODES)) {
 1368                 /*
 1369                  * XXX some drives report something wrong here (they claim to
 1370                  * support PIO mode 8 !). As mode is coded on 3 bits in
 1371                  * SET FEATURE, limit it to 7 (so limit i to 4).
 1372                  * If higher mode than 7 is found, abort.
 1373                  */
 1374                 for (i = 7; i >= 0; i--) {
 1375                         if ((params->atap_piomode_supp & (1 << i)) == 0)
 1376                                 continue;
 1377                         if (i > 4)
 1378                                 return;
 1379 
 1380                         valid_mode_found = 1;
 1381 
 1382                         if ((wdc->cap & WDC_CAPABILITY_MODE) == 0) {
 1383                                 drvp->PIO_cap = i + 3;
 1384                                 continue;
 1385                         }
 1386 
 1387                         /*
 1388                          * See if mode is accepted.
 1389                          * If the controller can't set its PIO mode,
 1390                          * assume the BIOS set it up correctly
 1391                          */
 1392                         if (ata_set_mode(drvp, 0x08 | (i + 3),
 1393                             at_poll) != CMD_OK)
 1394                                 continue;
 1395 
 1396                         /*
 1397                          * If controller's driver can't set its PIO mode,
 1398                          * set the highest one the controller supports
 1399                          */
 1400                         if (wdc->PIO_cap >= i + 3) {
 1401                                 drvp->PIO_mode = i + 3;
 1402                                 drvp->PIO_cap = i + 3;
 1403                                 break;
 1404                         }
 1405                 }
 1406                 if (!valid_mode_found) {
 1407                         /*
 1408                          * We didn't find a valid PIO mode.
 1409                          * Assume the values returned for DMA are buggy too
 1410                          */
 1411                         return;
 1412                 }
 1413                 drvp->drive_flags |= DRIVE_MODE;
 1414 
 1415                 /* Some controllers don't support ATAPI DMA */
 1416                 if ((drvp->drive_flags & DRIVE_ATAPI) &&
 1417                     (wdc->cap & WDC_CAPABILITY_NO_ATAPI_DMA))
 1418                         return;
 1419 
 1420                 valid_mode_found = 0;
 1421                 for (i = 7; i >= 0; i--) {
 1422                         if ((params->atap_dmamode_supp & (1 << i)) == 0)
 1423                                 continue;
 1424                         if ((wdc->cap & WDC_CAPABILITY_DMA) &&
 1425                             (wdc->cap & WDC_CAPABILITY_MODE))
 1426                                 if (ata_set_mode(drvp, 0x20 | i, at_poll)
 1427                                     != CMD_OK)
 1428                                         continue;
 1429 
 1430                         valid_mode_found = 1;
 1431 
 1432                         if (wdc->cap & WDC_CAPABILITY_DMA) {
 1433                                 if ((wdc->cap & WDC_CAPABILITY_MODE) &&
 1434                                     wdc->DMA_cap < i)
 1435                                         continue;
 1436                                 drvp->DMA_mode = i;
 1437                                 drvp->DMA_cap = i;
 1438                                 drvp->drive_flags |= DRIVE_DMA;
 1439                         }
 1440                         break;
 1441                 }
 1442                 if (params->atap_extensions & WDC_EXT_UDMA_MODES) {
 1443                         for (i = 7; i >= 0; i--) {
 1444                                 if ((params->atap_udmamode_supp & (1 << i))
 1445                                     == 0)
 1446                                         continue;
 1447                                 if ((wdc->cap & WDC_CAPABILITY_MODE) &&
 1448                                     (wdc->cap & WDC_CAPABILITY_UDMA))
 1449                                         if (ata_set_mode(drvp, 0x40 | i,
 1450                                             at_poll) != CMD_OK)
 1451                                                 continue;
 1452                                 if (wdc->cap & WDC_CAPABILITY_UDMA) {
 1453                                         if ((wdc->cap & WDC_CAPABILITY_MODE) &&
 1454                                             wdc->UDMA_cap < i)
 1455                                                 continue;
 1456                                         drvp->UDMA_mode = i;
 1457                                         drvp->UDMA_cap = i;
 1458                                         drvp->drive_flags |= DRIVE_UDMA;
 1459                                 }
 1460                                 break;
 1461                         }
 1462                 }
 1463         }
 1464 
 1465         /* Try to guess ATA version here, if it didn't get reported */
 1466         if (drvp->ata_vers == 0) {
 1467                 if (drvp->drive_flags & DRIVE_UDMA)
 1468                         drvp->ata_vers = 4; /* should be at last ATA-4 */
 1469                 else if (drvp->PIO_cap > 2)
 1470                         drvp->ata_vers = 2; /* should be at last ATA-2 */
 1471         }
 1472         if (cf_flags & ATA_CONFIG_PIO_SET) {
 1473                 drvp->PIO_mode =
 1474                     (cf_flags & ATA_CONFIG_PIO_MODES) >> ATA_CONFIG_PIO_OFF;
 1475                 drvp->drive_flags |= DRIVE_MODE;
 1476         }
 1477         if ((wdc->cap & WDC_CAPABILITY_DMA) == 0) {
 1478                 /* don't care about DMA modes */
 1479                 return;
 1480         }
 1481         if (cf_flags & ATA_CONFIG_DMA_SET) {
 1482                 if ((cf_flags & ATA_CONFIG_DMA_MODES) ==
 1483                     ATA_CONFIG_DMA_DISABLE) {
 1484                         drvp->drive_flags &= ~DRIVE_DMA;
 1485                 } else {
 1486                         drvp->DMA_mode = (cf_flags & ATA_CONFIG_DMA_MODES) >>
 1487                             ATA_CONFIG_DMA_OFF;
 1488                         drvp->drive_flags |= DRIVE_DMA | DRIVE_MODE;
 1489                 }
 1490         }
 1491         if ((wdc->cap & WDC_CAPABILITY_UDMA) == 0) {
 1492                 /* don't care about UDMA modes */
 1493                 return;
 1494         }
 1495         if (cf_flags & ATA_CONFIG_UDMA_SET) {
 1496                 if ((cf_flags & ATA_CONFIG_UDMA_MODES) ==
 1497                     ATA_CONFIG_UDMA_DISABLE) {
 1498                         drvp->drive_flags &= ~DRIVE_UDMA;
 1499                 } else {
 1500                         drvp->UDMA_mode = (cf_flags & ATA_CONFIG_UDMA_MODES) >>
 1501                             ATA_CONFIG_UDMA_OFF;
 1502                         drvp->drive_flags |= DRIVE_UDMA | DRIVE_MODE;
 1503                 }
 1504         }
 1505 }
 1506 
 1507 void
 1508 wdc_output_bytes(drvp, bytes, buflen)
 1509         struct ata_drive_datas *drvp;
 1510         void *bytes;
 1511         unsigned int buflen;
 1512 {
 1513         struct channel_softc *chp = drvp->chnl_softc;
 1514         unsigned int off = 0;
 1515         unsigned int len = buflen, roundlen;
 1516 
 1517         if (drvp->drive_flags & DRIVE_CAP32) {
 1518                 roundlen = len & ~3;
 1519 
 1520                 CHP_WRITE_RAW_MULTI_4(chp,
 1521                     (void *)((u_int8_t *)bytes + off), roundlen);
 1522 
 1523                 off += roundlen;
 1524                 len -= roundlen;
 1525         }
 1526 
 1527         if (len > 0) {
 1528                 roundlen = (len + 1) & ~0x1;
 1529 
 1530                 CHP_WRITE_RAW_MULTI_2(chp,
 1531                     (void *)((u_int8_t *)bytes + off), roundlen);
 1532         }
 1533 }
 1534 
 1535 void
 1536 wdc_input_bytes(drvp, bytes, buflen)
 1537         struct ata_drive_datas *drvp;
 1538         void *bytes;
 1539         unsigned int buflen;
 1540 {
 1541         struct channel_softc *chp = drvp->chnl_softc;
 1542         unsigned int off = 0;
 1543         unsigned int len = buflen, roundlen;
 1544 
 1545         if (drvp->drive_flags & DRIVE_CAP32) {
 1546                 roundlen = len & ~3;
 1547 
 1548                 CHP_READ_RAW_MULTI_4(chp,
 1549                     (void *)((u_int8_t *)bytes + off), roundlen);
 1550 
 1551                 off += roundlen;
 1552                 len -= roundlen;
 1553         }
 1554 
 1555         if (len > 0) {
 1556                 roundlen = (len + 1) & ~0x1;
 1557 
 1558                 CHP_READ_RAW_MULTI_2(chp,
 1559                     (void *)((u_int8_t *)bytes + off), roundlen);
 1560         }
 1561 }
 1562 
 1563 void
 1564 wdc_print_caps(drvp)
 1565         struct ata_drive_datas *drvp;
 1566 {
 1567         /* This is actually a lie until we fix the _probe_caps
 1568            algorithm. Don't print out lies */
 1569 #if 0
 1570         printf("%s: can use ", drvp->drive_name);
 1571 
 1572         if (drvp->drive_flags & DRIVE_CAP32) {
 1573                 printf("32-bit");
 1574         } else
 1575                 printf("16-bit");
 1576 
 1577         printf(", PIO mode %d", drvp->PIO_cap);
 1578 
 1579         if (drvp->drive_flags & DRIVE_DMA) {
 1580                 printf(", DMA mode %d", drvp->DMA_cap);
 1581         }
 1582 
 1583         if (drvp->drive_flags & DRIVE_UDMA) {
 1584                 printf(", Ultra-DMA mode %d", drvp->UDMA_cap);
 1585         }
 1586 
 1587         printf("\n");
 1588 #endif /* 0 */
 1589 }
 1590 
 1591 void
 1592 wdc_print_current_modes(chp)
 1593         struct channel_softc *chp;
 1594 {
 1595         int drive;
 1596         struct ata_drive_datas *drvp;
 1597 
 1598         for (drive = 0; drive < 2; drive++) {
 1599                 drvp = &chp->ch_drive[drive];
 1600                 if ((drvp->drive_flags & DRIVE) == 0)
 1601                         continue;
 1602 
 1603                 printf("%s(%s:%d:%d):",
 1604                     drvp->drive_name,
 1605                     chp->wdc->sc_dev.dv_xname, chp->channel, drive);
 1606 
 1607                 if ((chp->wdc->cap & WDC_CAPABILITY_MODE) == 0 &&
 1608                     !(drvp->cf_flags & ATA_CONFIG_PIO_SET))
 1609                         printf(" using BIOS timings");
 1610                 else
 1611                         printf(" using PIO mode %d", drvp->PIO_mode);
 1612                 if (drvp->drive_flags & DRIVE_DMA)
 1613                         printf(", DMA mode %d", drvp->DMA_mode);
 1614                 if (drvp->drive_flags & DRIVE_UDMA)
 1615                         printf(", Ultra-DMA mode %d", drvp->UDMA_mode);
 1616                 printf("\n");
 1617         }
 1618 }
 1619 
 1620 /*
 1621  * downgrade the transfer mode of a drive after an error. return 1 if
 1622  * downgrade was possible, 0 otherwise.
 1623  */
 1624 int
 1625 wdc_downgrade_mode(drvp)
 1626         struct ata_drive_datas *drvp;
 1627 {
 1628         struct channel_softc *chp = drvp->chnl_softc;
 1629         struct wdc_softc *wdc = chp->wdc;
 1630         int cf_flags = drvp->cf_flags;
 1631 
 1632         /* if drive or controller don't know its mode, we can't do much */
 1633         if ((drvp->drive_flags & DRIVE_MODE) == 0 ||
 1634             (wdc->cap & WDC_CAPABILITY_MODE) == 0)
 1635                 return 0;
 1636         /* current drive mode was set by a config flag, let it this way */
 1637         if ((cf_flags & ATA_CONFIG_PIO_SET) ||
 1638             (cf_flags & ATA_CONFIG_DMA_SET) ||
 1639             (cf_flags & ATA_CONFIG_UDMA_SET))
 1640                 return 0;
 1641 
 1642         /*
 1643          * We'd ideally like to use an Ultra DMA mode since they have the
 1644          * protection of a CRC. So we try each Ultra DMA mode and see if
 1645          * we can find any working combo
 1646          */
 1647         if ((drvp->drive_flags & DRIVE_UDMA) && drvp->UDMA_mode > 0) {
 1648                 drvp->UDMA_mode = drvp->UDMA_mode - 1;
 1649                 printf("%s: transfer error, downgrading to Ultra-DMA mode %d\n",
 1650                     drvp->drive_name, drvp->UDMA_mode);
 1651         } else  if ((drvp->drive_flags & DRIVE_UDMA) &&
 1652             (drvp->drive_flags & DRIVE_DMAERR) == 0) {
 1653                 /*
 1654                  * If we were using ultra-DMA, don't downgrade to
 1655                  * multiword DMA if we noticed a CRC error. It has
 1656                  * been noticed that CRC errors in ultra-DMA lead to
 1657                  * silent data corruption in multiword DMA.  Data
 1658                  * corruption is less likely to occur in PIO mode.
 1659                  */
 1660                 drvp->drive_flags &= ~DRIVE_UDMA;
 1661                 drvp->drive_flags |= DRIVE_DMA;
 1662                 drvp->DMA_mode = drvp->DMA_cap;
 1663                 printf("%s: transfer error, downgrading to DMA mode %d\n",
 1664                     drvp->drive_name, drvp->DMA_mode);
 1665         } else if (drvp->drive_flags & (DRIVE_DMA | DRIVE_UDMA)) {
 1666                 drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA);
 1667                 drvp->PIO_mode = drvp->PIO_cap;
 1668                 printf("%s: transfer error, downgrading to PIO mode %d\n",
 1669                     drvp->drive_name, drvp->PIO_mode);
 1670         } else /* already using PIO, can't downgrade */
 1671                 return 0;
 1672 
 1673         wdc->set_modes(chp);
 1674         /* reset the channel, which will schedule all drives for setup */
 1675         wdc_reset_channel(drvp);
 1676         return 1;
 1677 }
 1678 
 1679 int
 1680 wdc_exec_command(drvp, wdc_c)
 1681         struct ata_drive_datas *drvp;
 1682         struct wdc_command *wdc_c;
 1683 {
 1684         struct channel_softc *chp = drvp->chnl_softc;
 1685         struct wdc_xfer *xfer;
 1686         int s, ret;
 1687 
 1688         WDCDEBUG_PRINT(("wdc_exec_command %s:%d:%d\n",
 1689             chp->wdc->sc_dev.dv_xname, chp->channel, drvp->drive),
 1690             DEBUG_FUNCS);
 1691 
 1692         /* set up an xfer and queue. Wait for completion */
 1693         xfer = wdc_get_xfer(wdc_c->flags & AT_WAIT ? WDC_CANSLEEP :
 1694             WDC_NOSLEEP);
 1695         if (xfer == NULL) {
 1696                 return WDC_TRY_AGAIN;
 1697         }
 1698 
 1699         if (wdc_c->flags & AT_POLL)
 1700                 xfer->c_flags |= C_POLL;
 1701         xfer->drive = drvp->drive;
 1702         xfer->databuf = wdc_c->data;
 1703         xfer->c_bcount = wdc_c->bcount;
 1704         xfer->cmd = wdc_c;
 1705         xfer->c_start = __wdccommand_start;
 1706         xfer->c_intr = __wdccommand_intr;
 1707         xfer->c_kill_xfer = __wdccommand_done;
 1708 
 1709         s = splbio();
 1710         wdc_exec_xfer(chp, xfer);
 1711 #ifdef DIAGNOSTIC
 1712         if ((wdc_c->flags & AT_POLL) != 0 &&
 1713             (wdc_c->flags & AT_DONE) == 0)
 1714                 panic("wdc_exec_command: polled command not done");
 1715 #endif /* DIAGNOSTIC */
 1716         if (wdc_c->flags & AT_DONE) {
 1717                 ret = WDC_COMPLETE;
 1718         } else {
 1719                 if (wdc_c->flags & AT_WAIT) {
 1720                         WDCDEBUG_PRINT(("wdc_exec_command sleeping\n"),
 1721                                        DEBUG_FUNCS);
 1722 
 1723                         while ((wdc_c->flags & AT_DONE) == 0) {
 1724                                 tsleep(wdc_c, PRIBIO, "wdccmd", 0);
 1725                         }
 1726                         ret = WDC_COMPLETE;
 1727                 } else {
 1728                         ret = WDC_QUEUED;
 1729                 }
 1730         }
 1731         splx(s);
 1732         return ret;
 1733 }
 1734 
 1735 void
 1736 __wdccommand_start(chp, xfer)
 1737         struct channel_softc *chp;
 1738         struct wdc_xfer *xfer;
 1739 {
 1740         int drive = xfer->drive;
 1741         struct wdc_command *wdc_c = xfer->cmd;
 1742 
 1743         WDCDEBUG_PRINT(("__wdccommand_start %s:%d:%d\n",
 1744             chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive),
 1745             DEBUG_FUNCS);
 1746 
 1747         /*
 1748          * Disable interrupts if we're polling
 1749          */
 1750         if (xfer->c_flags & C_POLL) {
 1751                 wdc_disable_intr(chp);
 1752         }
 1753 
 1754         wdc_set_drive(chp, drive);
 1755         DELAY(1);
 1756 
 1757         /*
 1758          * For resets, we don't really care to make sure that
 1759          * the bus is free
 1760          */
 1761         if (wdc_c->r_command != ATAPI_SOFT_RESET) {
 1762                 if (wdcwait(chp, wdc_c->r_st_bmask | WDCS_DRQ,
 1763                     wdc_c->r_st_bmask, wdc_c->timeout) != 0) {
 1764                         goto timeout;
 1765                 }
 1766         } else
 1767                 DELAY(10);
 1768 
 1769         wdccommand(chp, drive, wdc_c->r_command, wdc_c->r_cyl, wdc_c->r_head,
 1770             wdc_c->r_sector, wdc_c->r_count, wdc_c->r_precomp);
 1771 
 1772         if ((wdc_c->flags & AT_WRITE) == AT_WRITE) {
 1773                 /* wait at least 400ns before reading status register */
 1774                 DELAY(10);
 1775                 if (wait_for_unbusy(chp, wdc_c->timeout) != 0)
 1776                         goto timeout;
 1777 
 1778                 if ((chp->ch_status & (WDCS_DRQ | WDCS_ERR)) == WDCS_ERR) {
 1779                         __wdccommand_done(chp, xfer);
 1780                         return;
 1781                 }
 1782 
 1783                 if (wait_for_drq(chp, wdc_c->timeout) != 0)
 1784                         goto timeout;
 1785 
 1786                 wdc_output_bytes(&chp->ch_drive[drive],
 1787                     wdc_c->data, wdc_c->bcount);
 1788         }
 1789 
 1790         if ((wdc_c->flags & AT_POLL) == 0) {
 1791                 chp->ch_flags |= WDCF_IRQ_WAIT; /* wait for interrupt */
 1792                 timeout_add(&chp->ch_timo, wdc_c->timeout / 1000 * hz);
 1793                 return;
 1794         }
 1795 
 1796         /*
 1797          * Polled command. Wait for drive ready or drq. Done in intr().
 1798          * Wait for at last 400ns for status bit to be valid.
 1799          */
 1800         delay(10);
 1801         __wdccommand_intr(chp, xfer, 0);
 1802         return;
 1803 
 1804 timeout:        
 1805         wdc_c->flags |= AT_TIMEOU;
 1806         __wdccommand_done(chp, xfer);
 1807 }
 1808 
 1809 int
 1810 __wdccommand_intr(chp, xfer, irq)
 1811         struct channel_softc *chp;
 1812         struct wdc_xfer *xfer;
 1813         int irq;
 1814 {
 1815         struct ata_drive_datas *drvp = &chp->ch_drive[xfer->drive];
 1816         struct wdc_command *wdc_c = xfer->cmd;
 1817         int bcount = wdc_c->bcount;
 1818         char *data = wdc_c->data;
 1819 
 1820         WDCDEBUG_PRINT(("__wdccommand_intr %s:%d:%d\n",
 1821             chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive), DEBUG_INTR);
 1822         if (wdcwait(chp, wdc_c->r_st_pmask, wdc_c->r_st_pmask,
 1823             (irq == 0) ? wdc_c->timeout : 0)) {
 1824                 if (irq && (xfer->c_flags & C_TIMEOU) == 0)
 1825                         return 0; /* IRQ was not for us */
 1826                 wdc_c->flags |= AT_TIMEOU;
 1827                 goto out;
 1828         }
 1829         if (chp->wdc->cap & WDC_CAPABILITY_IRQACK)
 1830                 chp->wdc->irqack(chp);
 1831         if (wdc_c->flags & AT_READ) {
 1832                 if ((chp->ch_status & WDCS_DRQ) == 0) {
 1833                         wdc_c->flags |= AT_TIMEOU;
 1834                         goto out;
 1835                 }
 1836                 wdc_input_bytes(drvp, data, bcount);
 1837                 /* Should we wait for device to indicate idle? */
 1838         }
 1839 out:
 1840         __wdccommand_done(chp, xfer);
 1841         WDCDEBUG_PRINT(("__wdccommand_intr returned\n"), DEBUG_INTR);
 1842         return 1;
 1843 }
 1844 
 1845 void
 1846 __wdccommand_done(chp, xfer)
 1847         struct channel_softc *chp;
 1848         struct wdc_xfer *xfer;
 1849 {
 1850         struct wdc_command *wdc_c = xfer->cmd;
 1851 
 1852         WDCDEBUG_PRINT(("__wdccommand_done %s:%d:%d %02x\n",
 1853             chp->wdc->sc_dev.dv_xname, chp->channel, xfer->drive,
 1854             chp->ch_status), DEBUG_FUNCS);
 1855         if (chp->ch_status & WDCS_DWF)
 1856                 wdc_c->flags |= AT_DF;
 1857         if (chp->ch_status & WDCS_ERR) {
 1858                 wdc_c->flags |= AT_ERROR;
 1859                 wdc_c->r_error = chp->ch_error;
 1860         }
 1861         wdc_c->flags |= AT_DONE;
 1862         if ((wdc_c->flags & AT_READREG) != 0 &&
 1863             (wdc_c->flags & (AT_ERROR | AT_DF)) == 0) {
 1864                 wdc_c->r_head = CHP_READ_REG(chp, wdr_sdh);
 1865                 wdc_c->r_cyl = CHP_READ_REG(chp, wdr_cyl_hi) << 8;
 1866                 wdc_c->r_cyl |= CHP_READ_REG(chp, wdr_cyl_lo);
 1867                 wdc_c->r_sector = CHP_READ_REG(chp, wdr_sector);
 1868                 wdc_c->r_count = CHP_READ_REG(chp, wdr_seccnt);
 1869                 wdc_c->r_error = CHP_READ_REG(chp, wdr_error);
 1870                 wdc_c->r_precomp = wdc_c->r_error;
 1871                 /* XXX CHP_READ_REG(chp, wdr_precomp); - precomp
 1872                    isn't a readable register */
 1873         }
 1874 
 1875         if (xfer->c_flags & C_POLL) {
 1876                 wdc_enable_intr(chp);
 1877         }
 1878 
 1879         wdc_free_xfer(chp, xfer);
 1880         WDCDEBUG_PRINT(("__wdccommand_done before callback\n"), DEBUG_INTR);
 1881 
 1882         if (wdc_c->flags & AT_WAIT)
 1883                 wakeup(wdc_c);
 1884         else
 1885                 if (wdc_c->callback)
 1886                         wdc_c->callback(wdc_c->callback_arg);
 1887         wdcstart(chp);
 1888         WDCDEBUG_PRINT(("__wdccommand_done returned\n"), DEBUG_INTR);
 1889 }
 1890 
 1891 /*
 1892  * Send a command. The drive should be ready.
 1893  * Assumes interrupts are blocked.
 1894  */
 1895 void
 1896 wdccommand(chp, drive, command, cylin, head, sector, count, precomp)
 1897         struct channel_softc *chp;
 1898         u_int8_t drive;
 1899         u_int8_t command;
 1900         u_int16_t cylin;
 1901         u_int8_t head, sector, count, precomp;
 1902 {
 1903         WDCDEBUG_PRINT(("wdccommand %s:%d:%d: command=0x%x cylin=%d head=%d "
 1904             "sector=%d count=%d precomp=%d\n", chp->wdc->sc_dev.dv_xname,
 1905             chp->channel, drive, command, cylin, head, sector, count, precomp),
 1906             DEBUG_FUNCS);
 1907         WDC_LOG_ATA_CMDLONG(chp, head, precomp, cylin, cylin >> 8, sector,
 1908             count, command);
 1909 
 1910         /* Select drive, head, and addressing mode. */
 1911         CHP_WRITE_REG(chp, wdr_sdh, WDSD_IBM | (drive << 4) | head);
 1912 
 1913         /* Load parameters. wdr_features(ATA/ATAPI) = wdr_precomp(ST506) */
 1914         CHP_WRITE_REG(chp, wdr_precomp, precomp);
 1915         CHP_WRITE_REG(chp, wdr_cyl_lo, cylin);
 1916         CHP_WRITE_REG(chp, wdr_cyl_hi, cylin >> 8);
 1917         CHP_WRITE_REG(chp, wdr_sector, sector);
 1918         CHP_WRITE_REG(chp, wdr_seccnt, count);
 1919 
 1920         /* Send command. */
 1921         CHP_WRITE_REG(chp, wdr_command, command);
 1922 }
 1923 
 1924 /*
 1925  * Send a 48-bit addressing command. The drive should be ready.
 1926  * Assumes interrupts are blocked.
 1927  */
 1928 void
 1929 wdccommandext(chp, drive, command, blkno, count)
 1930         struct channel_softc *chp;
 1931         u_int8_t drive;
 1932         u_int8_t command;
 1933         u_int64_t blkno;
 1934         u_int16_t count;
 1935 {
 1936         WDCDEBUG_PRINT(("wdccommandext %s:%d:%d: command=0x%x blkno=%llu "
 1937             "count=%d\n", chp->wdc->sc_dev.dv_xname,
 1938             chp->channel, drive, command, blkno, count),
 1939             DEBUG_FUNCS);
 1940         WDC_LOG_ATA_CMDEXT(chp, blkno >> 40, blkno >> 16, blkno >> 32,
 1941             blkno >> 8, blkno >> 24, blkno, count >> 8, count, command);
 1942 
 1943         /* Select drive and LBA mode. */
 1944         CHP_WRITE_REG(chp, wdr_sdh, (drive << 4) | WDSD_LBA);
 1945 
 1946         /* Load parameters. */
 1947         CHP_LBA48_WRITE_REG(chp, wdr_lba_hi,
 1948             ((blkno >> 32) & 0xff00) | ((blkno >> 16) & 0xff));
 1949         CHP_LBA48_WRITE_REG(chp, wdr_lba_mi,
 1950             ((blkno >> 24) & 0xff00) | ((blkno >> 8) & 0xff));
 1951         CHP_LBA48_WRITE_REG(chp, wdr_lba_lo,
 1952             ((blkno >> 16) & 0xff00) | (blkno & 0xff));
 1953         CHP_LBA48_WRITE_REG(chp, wdr_seccnt, count);
 1954 
 1955         /* Send command. */
 1956         CHP_WRITE_REG(chp, wdr_command, command);
 1957 }
 1958 
 1959 /*
 1960  * Simplified version of wdccommand().  Unbusy/ready/drq must be
 1961  * tested by the caller.
 1962  */
 1963 void
 1964 wdccommandshort(chp, drive, command)
 1965         struct channel_softc *chp;
 1966         int drive;
 1967         int command;
 1968 {
 1969 
 1970         WDCDEBUG_PRINT(("wdccommandshort %s:%d:%d command 0x%x\n",
 1971             chp->wdc->sc_dev.dv_xname, chp->channel, drive, command),
 1972             DEBUG_FUNCS);
 1973         WDC_LOG_ATA_CMDSHORT(chp, command);
 1974 
 1975         /* Select drive. */
 1976         CHP_WRITE_REG(chp, wdr_sdh, WDSD_IBM | (drive << 4));
 1977         CHP_WRITE_REG(chp, wdr_command, command);
 1978 }
 1979 
 1980 /* Add a command to the queue and start controller. Must be called at splbio */
 1981 
 1982 void
 1983 wdc_exec_xfer(chp, xfer)
 1984         struct channel_softc *chp;
 1985         struct wdc_xfer *xfer;
 1986 {
 1987         WDCDEBUG_PRINT(("wdc_exec_xfer %p flags 0x%x channel %d drive %d\n",
 1988             xfer, xfer->c_flags, chp->channel, xfer->drive), DEBUG_XFERS);
 1989 
 1990         /* complete xfer setup */
 1991         xfer->chp = chp;
 1992 
 1993         /*
 1994          * If we are a polled command, and the list is not empty,
 1995          * we are doing a dump. Drop the list to allow the polled command
 1996          * to complete, we're going to reboot soon anyway.
 1997          */
 1998         if ((xfer->c_flags & C_POLL) != 0 &&
 1999             !TAILQ_EMPTY(&chp->ch_queue->sc_xfer)) {
 2000                 TAILQ_INIT(&chp->ch_queue->sc_xfer);
 2001         }
 2002         /* insert at the end of command list */
 2003         TAILQ_INSERT_TAIL(&chp->ch_queue->sc_xfer,xfer , c_xferchain);
 2004         WDCDEBUG_PRINT(("wdcstart from wdc_exec_xfer, flags 0x%x\n",
 2005             chp->ch_flags), DEBUG_XFERS);
 2006         wdcstart(chp);
 2007 }
 2008 
 2009 struct wdc_xfer *
 2010 wdc_get_xfer(flags)
 2011         int flags;
 2012 {
 2013         struct wdc_xfer *xfer;
 2014         int s;
 2015 
 2016         s = splbio();
 2017         xfer = pool_get(&wdc_xfer_pool,
 2018             ((flags & WDC_NOSLEEP) != 0 ? PR_NOWAIT : PR_WAITOK));
 2019         splx(s);
 2020         if (xfer != NULL)
 2021                 memset(xfer, 0, sizeof(struct wdc_xfer));
 2022         return xfer;
 2023 }
 2024 
 2025 void
 2026 wdc_free_xfer(chp, xfer)
 2027         struct channel_softc *chp;
 2028         struct wdc_xfer *xfer;
 2029 {
 2030         struct wdc_softc *wdc = chp->wdc;
 2031         int s;
 2032 
 2033         if (wdc->cap & WDC_CAPABILITY_HWLOCK)
 2034                 (*wdc->free_hw)(chp);
 2035         s = splbio();
 2036         chp->ch_flags &= ~WDCF_ACTIVE;
 2037         TAILQ_REMOVE(&chp->ch_queue->sc_xfer, xfer, c_xferchain);
 2038         pool_put(&wdc_xfer_pool, xfer);
 2039         splx(s);
 2040 }
 2041 
 2042 
 2043 /*
 2044  * Kill off all pending xfers for a channel_softc.
 2045  *
 2046  * Must be called at splbio().
 2047  */
 2048 void
 2049 wdc_kill_pending(chp)
 2050         struct channel_softc *chp;
 2051 {
 2052         struct wdc_xfer *xfer;
 2053 
 2054         while ((xfer = TAILQ_FIRST(&chp->ch_queue->sc_xfer)) != NULL) {
 2055                 chp = xfer->chp;
 2056                 (*xfer->c_kill_xfer)(chp, xfer);
 2057         }
 2058 }
 2059 
 2060 void
 2061 __wdcerror(chp, msg)
 2062         struct channel_softc *chp;
 2063         char *msg;
 2064 {
 2065         struct wdc_xfer *xfer = TAILQ_FIRST(&chp->ch_queue->sc_xfer);
 2066         if (xfer == NULL)
 2067                 printf("%s:%d: %s\n", chp->wdc->sc_dev.dv_xname, chp->channel,
 2068                     msg);
 2069         else
 2070                 printf("%s(%s:%d:%d): %s\n",
 2071                     chp->ch_drive[xfer->drive].drive_name,
 2072                     chp->wdc->sc_dev.dv_xname,
 2073                     chp->channel, xfer->drive, msg);
 2074 }
 2075 
 2076 /*
 2077  * the bit bucket
 2078  */
 2079 void
 2080 wdcbit_bucket(chp, size)
 2081         struct channel_softc *chp;
 2082         int size;
 2083 {
 2084         CHP_READ_RAW_MULTI_2(chp, NULL, size);
 2085 }
 2086 
 2087 
 2088 #include <sys/ataio.h>
 2089 #include <sys/file.h>
 2090 #include <sys/buf.h>
 2091 
 2092 /*
 2093  * Glue necessary to hook ATAIOCCOMMAND into physio
 2094  */
 2095 
 2096 struct wdc_ioctl {
 2097         LIST_ENTRY(wdc_ioctl) wi_list;
 2098         struct buf wi_bp;
 2099         struct uio wi_uio;
 2100         struct iovec wi_iov;
 2101         atareq_t wi_atareq;
 2102         struct ata_drive_datas *wi_drvp;
 2103 };
 2104 
 2105 struct  wdc_ioctl *wdc_ioctl_find(struct buf *);
 2106 void    wdc_ioctl_free(struct wdc_ioctl *);
 2107 struct  wdc_ioctl *wdc_ioctl_get(void);
 2108 void    wdc_ioctl_strategy(struct buf *);
 2109 
 2110 LIST_HEAD(, wdc_ioctl) wi_head;
 2111 
 2112 /*
 2113  * Allocate space for a ioctl queue structure.  Mostly taken from
 2114  * scsipi_ioctl.c
 2115  */
 2116 struct wdc_ioctl *
 2117 wdc_ioctl_get()
 2118 {
 2119         struct wdc_ioctl *wi;
 2120         int s;
 2121 
 2122         wi = malloc(sizeof(struct wdc_ioctl), M_TEMP, M_WAITOK);
 2123         bzero(wi, sizeof (struct wdc_ioctl));
 2124         s = splbio();
 2125         LIST_INSERT_HEAD(&wi_head, wi, wi_list);
 2126         splx(s);
 2127         return (wi);
 2128 }
 2129 
 2130 /*
 2131  * Free an ioctl structure and remove it from our list
 2132  */
 2133 
 2134 void
 2135 wdc_ioctl_free(wi)
 2136         struct wdc_ioctl *wi;
 2137 {
 2138         int s;
 2139 
 2140         s = splbio();
 2141         LIST_REMOVE(wi, wi_list);
 2142         splx(s);
 2143         free(wi, M_TEMP);
 2144 }
 2145 
 2146 /*
 2147  * Find a wdc_ioctl structure based on the struct buf.
 2148  */
 2149 
 2150 struct wdc_ioctl *
 2151 wdc_ioctl_find(bp)
 2152         struct buf *bp;
 2153 {
 2154         struct wdc_ioctl *wi;
 2155         int s;
 2156 
 2157         s = splbio();
 2158         LIST_FOREACH(wi, &wi_head, wi_list)
 2159                 if (bp == &wi->wi_bp)
 2160                         break;
 2161         splx(s);
 2162         return (wi);
 2163 }
 2164 
 2165 /*
 2166  * Ioctl pseudo strategy routine
 2167  *
 2168  * This is mostly stolen from scsipi_ioctl.c:scsistrategy().  What
 2169  * happens here is:
 2170  *
 2171  * - wdioctl() queues a wdc_ioctl structure.
 2172  *
 2173  * - wdioctl() calls physio/wdc_ioctl_strategy based on whether or not
 2174  *   user space I/O is required.  If physio() is called, physio() eventually
 2175  *   calls wdc_ioctl_strategy().
 2176  *
 2177  * - In either case, wdc_ioctl_strategy() calls wdc_exec_command()
 2178  *   to perform the actual command
 2179  *
 2180  * The reason for the use of the pseudo strategy routine is because
 2181  * when doing I/O to/from user space, physio _really_ wants to be in
 2182  * the loop.  We could put the entire buffer into the ioctl request
 2183  * structure, but that won't scale if we want to do things like download
 2184  * microcode.
 2185  */
 2186 
 2187 void
 2188 wdc_ioctl_strategy(bp)
 2189         struct buf *bp;
 2190 {
 2191         struct wdc_ioctl *wi;
 2192         struct wdc_command wdc_c;
 2193         int error = 0;
 2194         int s;
 2195 
 2196         wi = wdc_ioctl_find(bp);
 2197         if (wi == NULL) {
 2198                 printf("user_strat: No ioctl\n");
 2199                 error = EINVAL;
 2200                 goto bad;
 2201         }
 2202 
 2203         bzero(&wdc_c, sizeof(wdc_c));
 2204 
 2205         /*
 2206          * Abort if physio broke up the transfer
 2207          */
 2208 
 2209         if ((u_long)bp->b_bcount != wi->wi_atareq.datalen) {
 2210                 printf("physio split wd ioctl request... cannot proceed\n");
 2211                 error = EIO;
 2212                 goto bad;
 2213         }
 2214 
 2215         /*
 2216          * Make sure a timeout was supplied in the ioctl request
 2217          */
 2218 
 2219         if (wi->wi_atareq.timeout == 0) {
 2220                 error = EINVAL;
 2221                 goto bad;
 2222         }
 2223 
 2224         if (wi->wi_atareq.flags & ATACMD_READ)
 2225                 wdc_c.flags |= AT_READ;
 2226         else if (wi->wi_atareq.flags & ATACMD_WRITE)
 2227                 wdc_c.flags |= AT_WRITE;
 2228 
 2229         if (wi->wi_atareq.flags & ATACMD_READREG)
 2230                 wdc_c.flags |= AT_READREG;
 2231 
 2232         wdc_c.flags |= AT_WAIT;
 2233 
 2234         wdc_c.timeout = wi->wi_atareq.timeout;
 2235         wdc_c.r_command = wi->wi_atareq.command;
 2236         wdc_c.r_head = wi->wi_atareq.head & 0x0f;
 2237         wdc_c.r_cyl = wi->wi_atareq.cylinder;
 2238         wdc_c.r_sector = wi->wi_atareq.sec_num;
 2239         wdc_c.r_count = wi->wi_atareq.sec_count;
 2240         wdc_c.r_precomp = wi->wi_atareq.features;
 2241         if (wi->wi_drvp->drive_flags & DRIVE_ATAPI) {
 2242                 wdc_c.r_st_bmask = 0;
 2243                 wdc_c.r_st_pmask = 0;
 2244                 if (wdc_c.r_command == WDCC_IDENTIFY)
 2245                         wdc_c.r_command = ATAPI_IDENTIFY_DEVICE;
 2246         } else {
 2247                 wdc_c.r_st_bmask = WDCS_DRDY;
 2248                 wdc_c.r_st_pmask = WDCS_DRDY;
 2249         }
 2250         wdc_c.data = wi->wi_bp.b_data;
 2251         wdc_c.bcount = wi->wi_bp.b_bcount;
 2252 
 2253         if (wdc_exec_command(wi->wi_drvp, &wdc_c) != WDC_COMPLETE) {
 2254                 wi->wi_atareq.retsts = ATACMD_ERROR;
 2255                 goto bad;
 2256         }
 2257 
 2258         if (wdc_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
 2259                 if (wdc_c.flags & AT_ERROR) {
 2260                         wi->wi_atareq.retsts = ATACMD_ERROR;
 2261                         wi->wi_atareq.error = wdc_c.r_error;
 2262                 } else if (wdc_c.flags & AT_DF)
 2263                         wi->wi_atareq.retsts = ATACMD_DF;
 2264                 else
 2265                         wi->wi_atareq.retsts = ATACMD_TIMEOUT;
 2266         } else {
 2267                 wi->wi_atareq.retsts = ATACMD_OK;
 2268                 if (wi->wi_atareq.flags & ATACMD_READREG) {
 2269                         wi->wi_atareq.head = wdc_c.r_head ;
 2270                         wi->wi_atareq.cylinder = wdc_c.r_cyl;
 2271                         wi->wi_atareq.sec_num = wdc_c.r_sector;
 2272                         wi->wi_atareq.sec_count = wdc_c.r_count;
 2273                         wi->wi_atareq.features = wdc_c.r_precomp;
 2274                         wi->wi_atareq.error = wdc_c.r_error;
 2275                 }
 2276         }
 2277 
 2278         bp->b_error = 0;
 2279         s = splbio();
 2280         biodone(bp);
 2281         splx(s);
 2282         return;
 2283 bad:
 2284         bp->b_flags |= B_ERROR;
 2285         bp->b_error = error;
 2286         s = splbio();
 2287         biodone(bp);
 2288         splx(s);
 2289 }
 2290 
 2291 int
 2292 wdc_ioctl(drvp, xfer, addr, flag, p)
 2293         struct ata_drive_datas *drvp;
 2294         u_long xfer;
 2295         caddr_t addr;
 2296         int flag;
 2297         struct proc *p;
 2298 {
 2299         int error = 0;
 2300 
 2301         switch (xfer) {
 2302         case ATAIOGETTRACE: {
 2303                 atagettrace_t *agt = (atagettrace_t *)addr;
 2304                 unsigned int size = 0;
 2305                 char *log_to_copy;
 2306 
 2307                 size = agt->buf_size;
 2308                 if (size > 65536) {
 2309                         size = 65536;
 2310                 }
 2311 
 2312                 log_to_copy = wdc_get_log(&size, &agt->bytes_left);
 2313 
 2314                 if (log_to_copy != NULL) {
 2315                         error = copyout(log_to_copy, agt->buf, size);
 2316                         free(log_to_copy, M_TEMP);
 2317                 }
 2318 
 2319                 agt->bytes_copied = size;
 2320                 break;
 2321         }
 2322 
 2323         case ATAIOCCOMMAND:
 2324                 /*
 2325                  * Make sure this command is (relatively) safe first
 2326                  */
 2327                 if ((((atareq_t *) addr)->flags & ATACMD_READ) == 0 &&
 2328                     (flag & FWRITE) == 0) {
 2329                         error = EBADF;
 2330                         goto exit;
 2331                 }
 2332                 {
 2333                 struct wdc_ioctl *wi;
 2334                 atareq_t *atareq = (atareq_t *) addr;
 2335 
 2336                 wi = wdc_ioctl_get();
 2337                 wi->wi_drvp = drvp;
 2338                 wi->wi_atareq = *atareq;
 2339 
 2340                 if (atareq->datalen && atareq->flags &
 2341                     (ATACMD_READ | ATACMD_WRITE)) {
 2342                         wi->wi_iov.iov_base = atareq->databuf;
 2343                         wi->wi_iov.iov_len = atareq->datalen;
 2344                         wi->wi_uio.uio_iov = &wi->wi_iov;
 2345                         wi->wi_uio.uio_iovcnt = 1;
 2346                         wi->wi_uio.uio_resid = atareq->datalen;
 2347                         wi->wi_uio.uio_offset = 0;
 2348                         wi->wi_uio.uio_segflg = UIO_USERSPACE;
 2349                         wi->wi_uio.uio_rw =
 2350                             (atareq->flags & ATACMD_READ) ? B_READ : B_WRITE;
 2351                         wi->wi_uio.uio_procp = curproc;
 2352                         error = physio(wdc_ioctl_strategy, &wi->wi_bp, 0,
 2353                             (atareq->flags & ATACMD_READ) ? B_READ : B_WRITE,
 2354                             minphys, &wi->wi_uio);
 2355                 } else {
 2356                         /* No need to call physio if we don't have any
 2357                            user data */
 2358                         wi->wi_bp.b_flags = 0;
 2359                         wi->wi_bp.b_data = 0;
 2360                         wi->wi_bp.b_bcount = 0;
 2361                         wi->wi_bp.b_dev = 0;
 2362                         wi->wi_bp.b_proc = curproc;
 2363                         LIST_INIT(&wi->wi_bp.b_dep);
 2364                         wdc_ioctl_strategy(&wi->wi_bp);
 2365                         error = wi->wi_bp.b_error;
 2366                 }
 2367                 *atareq = wi->wi_atareq;
 2368                 wdc_ioctl_free(wi);
 2369                 goto exit;
 2370                 }
 2371         default:
 2372                 error = ENOTTY;
 2373                 goto exit;
 2374         }
 2375 
 2376 exit:
 2377         return (error);
 2378 }

/* [<][>][^][v][top][bottom][index][help] */