1 /*
2 *
3 * skd.c: Solaris 11/10 Driver for sTec, Inc. S112x PCIe SSD card
4 *
5 * Solaris driver is based on the Linux driver authored by:
6 *
7 * Authors/Alphabetical: Dragan Stancevic <dstancevic@stec-inc.com>
8 * Gordon Waidhofer <gwaidhofer@stec-inc.com>
9 * John Hamilton <jhamilton@stec-inc.com>
10 */
11
12 /*
13 * This file and its contents are supplied under the terms of the
14 * Common Development and Distribution License ("CDDL"), version 1.0.
15 * You may only use this file in accordance with the terms of version
16 * 1.0 of the CDDL.
17 *
18 * A full copy of the text of the CDDL should have accompanied this
19 * source. A copy of the CDDL is also available via the Internet at
20 * http://www.illumos.org/license/CDDL.
21 */
22
23 /*
24 * Copyright 2013 STEC, Inc. All rights reserved.
25 * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
26 */
27
28 #include <sys/types.h>
29 #include <sys/stream.h>
30 #include <sys/cmn_err.h>
31 #include <sys/kmem.h>
32 #include <sys/file.h>
33 #include <sys/buf.h>
34 #include <sys/uio.h>
35 #include <sys/cred.h>
36 #include <sys/modctl.h>
37 #include <sys/debug.h>
38 #include <sys/modctl.h>
39 #include <sys/list.h>
40 #include <sys/sysmacros.h>
41 #include <sys/errno.h>
42 #include <sys/pcie.h>
43 #include <sys/pci.h>
44 #include <sys/ddi.h>
45 #include <sys/dditypes.h>
46 #include <sys/sunddi.h>
47 #include <sys/atomic.h>
48 #include <sys/mutex.h>
49 #include <sys/param.h>
50 #include <sys/devops.h>
51 #include <sys/blkdev.h>
52 #include <sys/queue.h>
53 #include <sys/scsi/impl/inquiry.h>
54
55 #include "skd_s1120.h"
56 #include "skd.h"
57
58 int skd_dbg_level = 0;
59
60 void *skd_state = NULL;
61 int skd_disable_msi = 0;
62 int skd_disable_msix = 0;
63
64 /* Initialized in _init() and tunable, see _init(). */
65 clock_t skd_timer_ticks;
66
67 /* I/O DMA attributes structures. */
68 static ddi_dma_attr_t skd_64bit_io_dma_attr = {
69 DMA_ATTR_V0, /* dma_attr_version */
70 SKD_DMA_LOW_ADDRESS, /* low DMA address range */
71 SKD_DMA_HIGH_64BIT_ADDRESS, /* high DMA address range */
72 SKD_DMA_XFER_COUNTER, /* DMA counter register */
73 SKD_DMA_ADDRESS_ALIGNMENT, /* DMA address alignment */
74 SKD_DMA_BURSTSIZES, /* DMA burstsizes */
75 SKD_DMA_MIN_XFER_SIZE, /* min effective DMA size */
76 SKD_DMA_MAX_XFER_SIZE, /* max DMA xfer size */
77 SKD_DMA_SEGMENT_BOUNDARY, /* segment boundary */
78 SKD_DMA_SG_LIST_LENGTH, /* s/g list length */
79 SKD_DMA_GRANULARITY, /* granularity of device */
80 SKD_DMA_XFER_FLAGS /* DMA transfer flags */
81 };
82
83 int skd_isr_type = -1;
84
85 #define SKD_MAX_QUEUE_DEPTH 255
86 #define SKD_MAX_QUEUE_DEPTH_DEFAULT 64
87 int skd_max_queue_depth = SKD_MAX_QUEUE_DEPTH_DEFAULT;
88
89 #define SKD_MAX_REQ_PER_MSG 14
90 #define SKD_MAX_REQ_PER_MSG_DEFAULT 1
91 int skd_max_req_per_msg = SKD_MAX_REQ_PER_MSG_DEFAULT;
92
93 #define SKD_MAX_N_SG_PER_REQ 4096
94 int skd_sgs_per_request = SKD_N_SG_PER_REQ_DEFAULT;
95
96 static int skd_sys_quiesce_dev(dev_info_t *);
97 static int skd_quiesce_dev(skd_device_t *);
98 static int skd_list_skmsg(skd_device_t *, int);
99 static int skd_list_skreq(skd_device_t *, int);
100 static int skd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
101 static int skd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
102 static int skd_format_internal_skspcl(struct skd_device *skdev);
103 static void skd_start(skd_device_t *);
104 static void skd_destroy_mutex(skd_device_t *skdev);
105 static void skd_enable_interrupts(struct skd_device *);
106 static void skd_request_fn_not_online(skd_device_t *skdev);
107 static void skd_send_internal_skspcl(struct skd_device *,
108 struct skd_special_context *, uint8_t);
109 static void skd_queue(skd_device_t *, skd_buf_private_t *);
110 static void *skd_alloc_dma_mem(skd_device_t *, dma_mem_t *, uint8_t);
111 static void skd_release_intr(skd_device_t *skdev);
112 static void skd_isr_fwstate(struct skd_device *skdev);
113 static void skd_isr_msg_from_dev(struct skd_device *skdev);
114 static void skd_soft_reset(struct skd_device *skdev);
115 static void skd_refresh_device_data(struct skd_device *skdev);
116 static void skd_update_props(skd_device_t *, dev_info_t *);
117 static void skd_end_request_abnormal(struct skd_device *, skd_buf_private_t *,
118 int, int);
119 static char *skd_pci_info(struct skd_device *skdev, char *str, size_t len);
120
121 static skd_buf_private_t *skd_get_queued_pbuf(skd_device_t *);
122
123 static void skd_bd_driveinfo(void *arg, bd_drive_t *drive);
124 static int skd_bd_mediainfo(void *arg, bd_media_t *media);
125 static int skd_bd_read(void *arg, bd_xfer_t *xfer);
126 static int skd_bd_write(void *arg, bd_xfer_t *xfer);
127 static int skd_devid_init(void *arg, dev_info_t *, ddi_devid_t *);
128
129
130 static bd_ops_t skd_bd_ops = {
131 BD_OPS_VERSION_0,
132 skd_bd_driveinfo,
133 skd_bd_mediainfo,
134 skd_devid_init,
135 NULL, /* sync_cache */
136 skd_bd_read,
137 skd_bd_write,
138 };
139
140 static ddi_device_acc_attr_t dev_acc_attr = {
141 DDI_DEVICE_ATTR_V0,
142 DDI_STRUCTURE_LE_ACC,
143 DDI_STRICTORDER_ACC
144 };
145
146 /*
147 * Solaris module loading/unloading structures
148 */
149 struct dev_ops skd_dev_ops = {
150 DEVO_REV, /* devo_rev */
151 0, /* refcnt */
152 ddi_no_info, /* getinfo */
153 nulldev, /* identify */
154 nulldev, /* probe */
155 skd_attach, /* attach */
156 skd_detach, /* detach */
157 nodev, /* reset */
158 NULL, /* char/block ops */
159 NULL, /* bus operations */
160 NULL, /* power management */
161 skd_sys_quiesce_dev /* quiesce */
162 };
163
164 static struct modldrv modldrv = {
165 &mod_driverops, /* type of module: driver */
166 "sTec skd v" DRV_VER_COMPL, /* name of module */
167 &skd_dev_ops /* driver dev_ops */
168 };
169
170 static struct modlinkage modlinkage = {
171 MODREV_1,
172 &modldrv,
173 NULL
174 };
175
176 /*
177 * sTec-required wrapper for debug printing.
178 */
179 /*PRINTFLIKE2*/
180 static inline void
Dcmn_err(int lvl,const char * fmt,...)181 Dcmn_err(int lvl, const char *fmt, ...)
182 {
183 va_list ap;
184
185 if (skd_dbg_level == 0)
186 return;
187
188 va_start(ap, fmt);
189 vcmn_err(lvl, fmt, ap);
190 va_end(ap);
191 }
192
193 /*
194 * Solaris module loading/unloading routines
195 */
196
197 /*
198 *
199 * Name: _init, performs initial installation
200 *
201 * Inputs: None.
202 *
203 * Returns: Returns the value returned by the ddi_softstate_init function
204 * on a failure to create the device state structure or the result
205 * of the module install routines.
206 *
207 */
208 int
_init(void)209 _init(void)
210 {
211 int rval = 0;
212 int tgts = 0;
213
214 tgts |= 0x02;
215 tgts |= 0x08; /* In #ifdef NEXENTA block from original sTec drop. */
216
217 /*
218 * drv_usectohz() is a function, so can't initialize it at
219 * instantiation.
220 */
221 skd_timer_ticks = drv_usectohz(1000000);
222
223 Dcmn_err(CE_NOTE,
224 "<# Installing skd Driver dbg-lvl=%d %s %x>",
225 skd_dbg_level, DRV_BUILD_ID, tgts);
226
227 rval = ddi_soft_state_init(&skd_state, sizeof (skd_device_t), 0);
228 if (rval != DDI_SUCCESS)
229 return (rval);
230
231 bd_mod_init(&skd_dev_ops);
232
233 rval = mod_install(&modlinkage);
234 if (rval != DDI_SUCCESS) {
235 ddi_soft_state_fini(&skd_state);
236 bd_mod_fini(&skd_dev_ops);
237 }
238
239 return (rval);
240 }
241
242 /*
243 *
244 * Name: _info, returns information about loadable module.
245 *
246 * Inputs: modinfo, pointer to module information structure.
247 *
248 * Returns: Value returned by mod_info().
249 *
250 */
251 int
_info(struct modinfo * modinfop)252 _info(struct modinfo *modinfop)
253 {
254 return (mod_info(&modlinkage, modinfop));
255 }
256
257 /*
258 * _fini Prepares a module for unloading. It is called when the system
259 * wants to unload a module. If the module determines that it can
260 * be unloaded, then _fini() returns the value returned by
261 * mod_remove(). Upon successful return from _fini() no other
262 * routine in the module will be called before _init() is called.
263 *
264 * Inputs: None.
265 *
266 * Returns: DDI_SUCCESS or DDI_FAILURE.
267 *
268 */
269 int
_fini(void)270 _fini(void)
271 {
272 int rval;
273
274 rval = mod_remove(&modlinkage);
275 if (rval == DDI_SUCCESS) {
276 ddi_soft_state_fini(&skd_state);
277 bd_mod_fini(&skd_dev_ops);
278 }
279
280 return (rval);
281 }
282
283 /*
284 * Solaris Register read/write routines
285 */
286
287 /*
288 *
289 * Name: skd_reg_write64, writes a 64-bit value to specified address
290 *
291 * Inputs: skdev - device state structure.
292 * val - 64-bit value to be written.
293 * offset - offset from PCI base address.
294 *
295 * Returns: Nothing.
296 *
297 */
298 /*
299 * Local vars are to keep lint silent. Any compiler worth its weight will
300 * optimize it all right out...
301 */
302 static inline void
skd_reg_write64(struct skd_device * skdev,uint64_t val,uint32_t offset)303 skd_reg_write64(struct skd_device *skdev, uint64_t val, uint32_t offset)
304 {
305 uint64_t *addr;
306
307 ASSERT((offset & 0x7) == 0);
308 /* LINTED */
309 addr = (uint64_t *)(skdev->dev_iobase + offset);
310 ddi_put64(skdev->dev_handle, addr, val);
311 }
312
313 /*
314 *
315 * Name: skd_reg_read32, reads a 32-bit value to specified address
316 *
317 * Inputs: skdev - device state structure.
318 * offset - offset from PCI base address.
319 *
320 * Returns: val, 32-bit value read from specified PCI address.
321 *
322 */
323 static inline uint32_t
skd_reg_read32(struct skd_device * skdev,uint32_t offset)324 skd_reg_read32(struct skd_device *skdev, uint32_t offset)
325 {
326 uint32_t *addr;
327
328 ASSERT((offset & 0x3) == 0);
329 /* LINTED */
330 addr = (uint32_t *)(skdev->dev_iobase + offset);
331 return (ddi_get32(skdev->dev_handle, addr));
332 }
333
334 /*
335 *
336 * Name: skd_reg_write32, writes a 32-bit value to specified address
337 *
338 * Inputs: skdev - device state structure.
339 * val - value to be written.
340 * offset - offset from PCI base address.
341 *
342 * Returns: Nothing.
343 *
344 */
345 static inline void
skd_reg_write32(struct skd_device * skdev,uint32_t val,uint32_t offset)346 skd_reg_write32(struct skd_device *skdev, uint32_t val, uint32_t offset)
347 {
348 uint32_t *addr;
349
350 ASSERT((offset & 0x3) == 0);
351 /* LINTED */
352 addr = (uint32_t *)(skdev->dev_iobase + offset);
353 ddi_put32(skdev->dev_handle, addr, val);
354 }
355
356
357 /*
358 * Solaris skd routines
359 */
360
361 /*
362 *
363 * Name: skd_name, generates the name of the driver.
364 *
365 * Inputs: skdev - device state structure
366 *
367 * Returns: char pointer to generated driver name.
368 *
369 */
370 static const char *
skd_name(struct skd_device * skdev)371 skd_name(struct skd_device *skdev)
372 {
373 (void) snprintf(skdev->id_str, sizeof (skdev->id_str), "%s:", DRV_NAME);
374
375 return (skdev->id_str);
376 }
377
378 /*
379 *
380 * Name: skd_pci_find_capability, searches the PCI capability
381 * list for the specified capability.
382 *
383 * Inputs: skdev - device state structure.
384 * cap - capability sought.
385 *
386 * Returns: Returns position where capability was found.
387 * If not found, returns zero.
388 *
389 */
390 static int
skd_pci_find_capability(struct skd_device * skdev,int cap)391 skd_pci_find_capability(struct skd_device *skdev, int cap)
392 {
393 uint16_t status;
394 uint8_t pos, id, hdr;
395 int ttl = 48;
396
397 status = pci_config_get16(skdev->pci_handle, PCI_CONF_STAT);
398
399 if (!(status & PCI_STAT_CAP))
400 return (0);
401
402 hdr = pci_config_get8(skdev->pci_handle, PCI_CONF_HEADER);
403
404 if ((hdr & PCI_HEADER_TYPE_M) != 0)
405 return (0);
406
407 pos = pci_config_get8(skdev->pci_handle, PCI_CONF_CAP_PTR);
408
409 while (ttl-- && pos >= 0x40) {
410 pos &= ~3;
411 id = pci_config_get8(skdev->pci_handle, pos+PCI_CAP_ID);
412 if (id == 0xff)
413 break;
414 if (id == cap)
415 return (pos);
416 pos = pci_config_get8(skdev->pci_handle, pos+PCI_CAP_NEXT_PTR);
417 }
418
419 return (0);
420 }
421
422 /*
423 *
424 * Name: skd_io_done, called to conclude an I/O operation.
425 *
426 * Inputs: skdev - device state structure.
427 * pbuf - I/O request
428 * error - contain error value.
429 * mode - debug only.
430 *
431 * Returns: Nothing.
432 *
433 */
434 static void
skd_io_done(skd_device_t * skdev,skd_buf_private_t * pbuf,int error,int mode)435 skd_io_done(skd_device_t *skdev, skd_buf_private_t *pbuf,
436 int error, int mode)
437 {
438 bd_xfer_t *xfer;
439
440 ASSERT(pbuf != NULL);
441
442 xfer = pbuf->x_xfer;
443
444 switch (mode) {
445 case SKD_IODONE_WIOC:
446 skdev->iodone_wioc++;
447 break;
448 case SKD_IODONE_WNIOC:
449 skdev->iodone_wnioc++;
450 break;
451 case SKD_IODONE_WDEBUG:
452 skdev->iodone_wdebug++;
453 break;
454 default:
455 skdev->iodone_unknown++;
456 }
457
458 if (error) {
459 skdev->ios_errors++;
460 cmn_err(CE_WARN,
461 "!%s:skd_io_done:ERR=%d %lld-%ld %s", skdev->name,
462 error, xfer->x_blkno, xfer->x_nblks,
463 (pbuf->dir & B_READ) ? "Read" : "Write");
464 }
465
466 kmem_free(pbuf, sizeof (skd_buf_private_t));
467
468 bd_xfer_done(xfer, error);
469 }
470
471 /*
472 * QUIESCE DEVICE
473 */
474
475 /*
476 *
477 * Name: skd_sys_quiesce_dev, quiets the device
478 *
479 * Inputs: dip - dev info strucuture
480 *
481 * Returns: Zero.
482 *
483 */
484 static int
skd_sys_quiesce_dev(dev_info_t * dip)485 skd_sys_quiesce_dev(dev_info_t *dip)
486 {
487 skd_device_t *skdev;
488
489 skdev = ddi_get_soft_state(skd_state, ddi_get_instance(dip));
490
491 /* make sure Dcmn_err() doesn't actually print anything */
492 skd_dbg_level = 0;
493
494 skd_disable_interrupts(skdev);
495 skd_soft_reset(skdev);
496
497 return (0);
498 }
499
500 /*
501 *
502 * Name: skd_quiesce_dev, quiets the device, but doesn't really do much.
503 *
504 * Inputs: skdev - Device state.
505 *
506 * Returns: -EINVAL if device is not in proper state otherwise
507 * returns zero.
508 *
509 */
510 static int
skd_quiesce_dev(skd_device_t * skdev)511 skd_quiesce_dev(skd_device_t *skdev)
512 {
513 int rc = 0;
514
515 if (skd_dbg_level)
516 Dcmn_err(CE_NOTE, "skd_quiece_dev:");
517
518 switch (skdev->state) {
519 case SKD_DRVR_STATE_BUSY:
520 case SKD_DRVR_STATE_BUSY_IMMINENT:
521 Dcmn_err(CE_NOTE, "%s: stopping queue", skdev->name);
522 break;
523 case SKD_DRVR_STATE_ONLINE:
524 case SKD_DRVR_STATE_STOPPING:
525 case SKD_DRVR_STATE_SYNCING:
526 case SKD_DRVR_STATE_PAUSING:
527 case SKD_DRVR_STATE_PAUSED:
528 case SKD_DRVR_STATE_STARTING:
529 case SKD_DRVR_STATE_RESTARTING:
530 case SKD_DRVR_STATE_RESUMING:
531 default:
532 rc = -EINVAL;
533 cmn_err(CE_NOTE, "state [%d] not implemented", skdev->state);
534 }
535
536 return (rc);
537 }
538
539 /*
540 * UNQUIESCE DEVICE:
541 * Note: Assumes lock is held to protect device state.
542 */
543 /*
544 *
545 * Name: skd_unquiesce_dev, awkens the device
546 *
547 * Inputs: skdev - Device state.
548 *
549 * Returns: -EINVAL if device is not in proper state otherwise
550 * returns zero.
551 *
552 */
553 static int
skd_unquiesce_dev(struct skd_device * skdev)554 skd_unquiesce_dev(struct skd_device *skdev)
555 {
556 Dcmn_err(CE_NOTE, "skd_unquiece_dev:");
557
558 skd_log_skdev(skdev, "unquiesce");
559 if (skdev->state == SKD_DRVR_STATE_ONLINE) {
560 Dcmn_err(CE_NOTE, "**** device already ONLINE");
561
562 return (0);
563 }
564 if (skdev->drive_state != FIT_SR_DRIVE_ONLINE) {
565 /*
566 * If there has been an state change to other than
567 * ONLINE, we will rely on controller state change
568 * to come back online and restart the queue.
569 * The BUSY state means that driver is ready to
570 * continue normal processing but waiting for controller
571 * to become available.
572 */
573 skdev->state = SKD_DRVR_STATE_BUSY;
574 Dcmn_err(CE_NOTE, "drive BUSY state\n");
575
576 return (0);
577 }
578 /*
579 * Drive just come online, driver is either in startup,
580 * paused performing a task, or bust waiting for hardware.
581 */
582 switch (skdev->state) {
583 case SKD_DRVR_STATE_PAUSED:
584 case SKD_DRVR_STATE_BUSY:
585 case SKD_DRVR_STATE_BUSY_IMMINENT:
586 case SKD_DRVR_STATE_BUSY_ERASE:
587 case SKD_DRVR_STATE_STARTING:
588 case SKD_DRVR_STATE_RESTARTING:
589 case SKD_DRVR_STATE_FAULT:
590 case SKD_DRVR_STATE_IDLE:
591 case SKD_DRVR_STATE_LOAD:
592 skdev->state = SKD_DRVR_STATE_ONLINE;
593 Dcmn_err(CE_NOTE, "%s: sTec s1120 ONLINE", skdev->name);
594 Dcmn_err(CE_NOTE, "%s: Starting request queue", skdev->name);
595 Dcmn_err(CE_NOTE,
596 "%s: queue depth limit=%d hard=%d soft=%d lowat=%d",
597 skdev->name,
598 skdev->queue_depth_limit,
599 skdev->hard_queue_depth_limit,
600 skdev->soft_queue_depth_limit,
601 skdev->queue_depth_lowat);
602
603 skdev->gendisk_on = 1;
604 cv_signal(&skdev->cv_waitq);
605 break;
606 case SKD_DRVR_STATE_DISAPPEARED:
607 default:
608 cmn_err(CE_NOTE, "**** driver state %d, not implemented \n",
609 skdev->state);
610 return (-EBUSY);
611 }
612
613 return (0);
614 }
615
616 /*
617 * READ/WRITE REQUESTS
618 */
619
620 /*
621 *
622 * Name: skd_blkdev_preop_sg_list, builds the S/G list from info
623 * passed in by the blkdev driver.
624 *
625 * Inputs: skdev - device state structure.
626 * skreq - request structure.
627 * sg_byte_count - data transfer byte count.
628 *
629 * Returns: Nothing.
630 *
631 */
632 /*ARGSUSED*/
633 static void
skd_blkdev_preop_sg_list(struct skd_device * skdev,struct skd_request_context * skreq,uint32_t * sg_byte_count)634 skd_blkdev_preop_sg_list(struct skd_device *skdev,
635 struct skd_request_context *skreq, uint32_t *sg_byte_count)
636 {
637 bd_xfer_t *xfer;
638 skd_buf_private_t *pbuf;
639 int i, bcount = 0;
640 uint_t n_sg;
641
642 *sg_byte_count = 0;
643
644 ASSERT(skreq->sg_data_dir == SKD_DATA_DIR_HOST_TO_CARD ||
645 skreq->sg_data_dir == SKD_DATA_DIR_CARD_TO_HOST);
646
647 pbuf = skreq->pbuf;
648 ASSERT(pbuf != NULL);
649
650 xfer = pbuf->x_xfer;
651 n_sg = xfer->x_ndmac;
652
653 ASSERT(n_sg <= skdev->sgs_per_request);
654
655 skreq->n_sg = n_sg;
656
657 skreq->io_dma_handle = xfer->x_dmah;
658
659 skreq->total_sg_bcount = 0;
660
661 for (i = 0; i < n_sg; i++) {
662 ddi_dma_cookie_t *cookiep = &xfer->x_dmac;
663 struct fit_sg_descriptor *sgd;
664 uint32_t cnt = (uint32_t)cookiep->dmac_size;
665
666 bcount += cnt;
667
668 sgd = &skreq->sksg_list[i];
669 sgd->control = FIT_SGD_CONTROL_NOT_LAST;
670 sgd->byte_count = cnt;
671 sgd->host_side_addr = cookiep->dmac_laddress;
672 sgd->dev_side_addr = 0; /* not used */
673 *sg_byte_count += cnt;
674
675 skreq->total_sg_bcount += cnt;
676
677 if ((i + 1) != n_sg)
678 ddi_dma_nextcookie(skreq->io_dma_handle, &xfer->x_dmac);
679 }
680
681 skreq->sksg_list[n_sg - 1].next_desc_ptr = 0LL;
682 skreq->sksg_list[n_sg - 1].control = FIT_SGD_CONTROL_LAST;
683
684 (void) ddi_dma_sync(skreq->sksg_dma_address.dma_handle, 0, 0,
685 DDI_DMA_SYNC_FORDEV);
686 }
687
688 /*
689 *
690 * Name: skd_blkdev_postop_sg_list, deallocates DMA
691 *
692 * Inputs: skdev - device state structure.
693 * skreq - skreq data structure.
694 *
695 * Returns: Nothing.
696 *
697 */
698 /* ARGSUSED */ /* Upstream common source with other platforms. */
699 static void
skd_blkdev_postop_sg_list(struct skd_device * skdev,struct skd_request_context * skreq)700 skd_blkdev_postop_sg_list(struct skd_device *skdev,
701 struct skd_request_context *skreq)
702 {
703 /*
704 * restore the next ptr for next IO request so we
705 * don't have to set it every time.
706 */
707 skreq->sksg_list[skreq->n_sg - 1].next_desc_ptr =
708 skreq->sksg_dma_address.cookies->dmac_laddress +
709 ((skreq->n_sg) * sizeof (struct fit_sg_descriptor));
710 }
711
712 /*
713 *
714 * Name: skd_start, initiates an I/O.
715 *
716 * Inputs: skdev - device state structure.
717 *
718 * Returns: EAGAIN if devicfe is not ONLINE.
719 * On error, if the caller is the blkdev driver, return
720 * the error value. Otherwise, return zero.
721 *
722 */
723 /* Upstream common source with other platforms. */
724 static void
skd_start(skd_device_t * skdev)725 skd_start(skd_device_t *skdev)
726 {
727 struct skd_fitmsg_context *skmsg = NULL;
728 struct fit_msg_hdr *fmh = NULL;
729 struct skd_request_context *skreq = NULL;
730 struct waitqueue *waitq = &skdev->waitqueue;
731 struct skd_scsi_request *scsi_req;
732 skd_buf_private_t *pbuf = NULL;
733 int bcount;
734
735 uint32_t lba;
736 uint32_t count;
737 uint32_t timo_slot;
738 void *cmd_ptr;
739 uint32_t sg_byte_count = 0;
740
741 /*
742 * Stop conditions:
743 * - There are no more native requests
744 * - There are already the maximum number of requests is progress
745 * - There are no more skd_request_context entries
746 * - There are no more FIT msg buffers
747 */
748 for (;;) {
749 /* Are too many requests already in progress? */
750 if (skdev->queue_depth_busy >= skdev->queue_depth_limit) {
751 Dcmn_err(CE_NOTE, "qdepth %d, limit %d\n",
752 skdev->queue_depth_busy,
753 skdev->queue_depth_limit);
754 break;
755 }
756
757 WAITQ_LOCK(skdev);
758 if (SIMPLEQ_EMPTY(waitq)) {
759 WAITQ_UNLOCK(skdev);
760 break;
761 }
762
763 /* Is a skd_request_context available? */
764 skreq = skdev->skreq_free_list;
765 if (skreq == NULL) {
766 WAITQ_UNLOCK(skdev);
767 break;
768 }
769
770 ASSERT(skreq->state == SKD_REQ_STATE_IDLE);
771 ASSERT((skreq->id & SKD_ID_INCR) == 0);
772
773 skdev->skreq_free_list = skreq->next;
774
775 skreq->state = SKD_REQ_STATE_BUSY;
776 skreq->id += SKD_ID_INCR;
777
778 /* Start a new FIT msg if there is none in progress. */
779 if (skmsg == NULL) {
780 /* Are there any FIT msg buffers available? */
781 skmsg = skdev->skmsg_free_list;
782 if (skmsg == NULL) {
783 WAITQ_UNLOCK(skdev);
784 break;
785 }
786
787 ASSERT(skmsg->state == SKD_MSG_STATE_IDLE);
788 ASSERT((skmsg->id & SKD_ID_INCR) == 0);
789
790 skdev->skmsg_free_list = skmsg->next;
791
792 skmsg->state = SKD_MSG_STATE_BUSY;
793 skmsg->id += SKD_ID_INCR;
794
795 /* Initialize the FIT msg header */
796 fmh = (struct fit_msg_hdr *)skmsg->msg_buf64;
797 bzero(fmh, sizeof (*fmh)); /* Too expensive */
798 fmh->protocol_id = FIT_PROTOCOL_ID_SOFIT;
799 skmsg->length = sizeof (struct fit_msg_hdr);
800 }
801
802 /*
803 * At this point we are committed to either start or reject
804 * the native request. Note that a FIT msg may have just been
805 * started but contains no SoFIT requests yet.
806 * Now - dequeue pbuf.
807 */
808 pbuf = skd_get_queued_pbuf(skdev);
809 WAITQ_UNLOCK(skdev);
810
811 skreq->pbuf = pbuf;
812 lba = pbuf->x_xfer->x_blkno;
813 count = pbuf->x_xfer->x_nblks;
814 skreq->did_complete = 0;
815
816 skreq->fitmsg_id = skmsg->id;
817
818 Dcmn_err(CE_NOTE,
819 "pbuf=%p lba=%u(0x%x) count=%u(0x%x) dir=%x\n",
820 (void *)pbuf, lba, lba, count, count, pbuf->dir);
821
822 /*
823 * Transcode the request.
824 */
825 cmd_ptr = &skmsg->msg_buf[skmsg->length];
826 bzero(cmd_ptr, 32); /* This is too expensive */
827
828 scsi_req = cmd_ptr;
829 scsi_req->hdr.tag = skreq->id;
830 scsi_req->hdr.sg_list_dma_address =
831 cpu_to_be64(skreq->sksg_dma_address.cookies->dmac_laddress);
832 scsi_req->cdb[1] = 0;
833 scsi_req->cdb[2] = (lba & 0xff000000) >> 24;
834 scsi_req->cdb[3] = (lba & 0xff0000) >> 16;
835 scsi_req->cdb[4] = (lba & 0xff00) >> 8;
836 scsi_req->cdb[5] = (lba & 0xff);
837 scsi_req->cdb[6] = 0;
838 scsi_req->cdb[7] = (count & 0xff00) >> 8;
839 scsi_req->cdb[8] = count & 0xff;
840 scsi_req->cdb[9] = 0;
841
842 if (pbuf->dir & B_READ) {
843 scsi_req->cdb[0] = 0x28;
844 skreq->sg_data_dir = SKD_DATA_DIR_CARD_TO_HOST;
845 } else {
846 scsi_req->cdb[0] = 0x2a;
847 skreq->sg_data_dir = SKD_DATA_DIR_HOST_TO_CARD;
848 }
849
850 skd_blkdev_preop_sg_list(skdev, skreq, &sg_byte_count);
851
852 scsi_req->hdr.sg_list_len_bytes = cpu_to_be32(sg_byte_count);
853
854 bcount = (sg_byte_count + 511) / 512;
855 scsi_req->cdb[7] = (bcount & 0xff00) >> 8;
856 scsi_req->cdb[8] = bcount & 0xff;
857
858 Dcmn_err(CE_NOTE,
859 "skd_start: pbuf=%p skreq->id=%x opc=%x ====>>>>>",
860 (void *)pbuf, skreq->id, *scsi_req->cdb);
861
862 skmsg->length += sizeof (struct skd_scsi_request);
863 fmh->num_protocol_cmds_coalesced++;
864
865 /*
866 * Update the active request counts.
867 * Capture the timeout timestamp.
868 */
869 skreq->timeout_stamp = skdev->timeout_stamp;
870 timo_slot = skreq->timeout_stamp & SKD_TIMEOUT_SLOT_MASK;
871
872 atomic_inc_32(&skdev->timeout_slot[timo_slot]);
873 atomic_inc_32(&skdev->queue_depth_busy);
874
875 Dcmn_err(CE_NOTE, "req=0x%x busy=%d timo_slot=%d",
876 skreq->id, skdev->queue_depth_busy, timo_slot);
877 /*
878 * If the FIT msg buffer is full send it.
879 */
880 if (skmsg->length >= SKD_N_FITMSG_BYTES ||
881 fmh->num_protocol_cmds_coalesced >= skd_max_req_per_msg) {
882
883 atomic_inc_64(&skdev->active_cmds);
884 pbuf->skreq = skreq;
885
886 skdev->fitmsg_sent1++;
887 skd_send_fitmsg(skdev, skmsg);
888
889 skmsg = NULL;
890 fmh = NULL;
891 }
892 }
893
894 /*
895 * Is a FIT msg in progress? If it is empty put the buffer back
896 * on the free list. If it is non-empty send what we got.
897 * This minimizes latency when there are fewer requests than
898 * what fits in a FIT msg.
899 */
900 if (skmsg != NULL) {
901 ASSERT(skmsg->length > sizeof (struct fit_msg_hdr));
902 Dcmn_err(CE_NOTE, "sending msg=%p, len %d",
903 (void *)skmsg, skmsg->length);
904
905 skdev->active_cmds++;
906
907 skdev->fitmsg_sent2++;
908 skd_send_fitmsg(skdev, skmsg);
909 }
910 }
911
912 /*
913 *
914 * Name: skd_end_request
915 *
916 * Inputs: skdev - device state structure.
917 * skreq - request structure.
918 * error - I/O error value.
919 *
920 * Returns: Nothing.
921 *
922 */
923 static void
skd_end_request(struct skd_device * skdev,struct skd_request_context * skreq,int error)924 skd_end_request(struct skd_device *skdev,
925 struct skd_request_context *skreq, int error)
926 {
927 skdev->ios_completed++;
928 skd_io_done(skdev, skreq->pbuf, error, SKD_IODONE_WIOC);
929 skreq->pbuf = NULL;
930 skreq->did_complete = 1;
931 }
932
933 /*
934 *
935 * Name: skd_end_request_abnormal
936 *
937 * Inputs: skdev - device state structure.
938 * pbuf - I/O request.
939 * error - I/O error value.
940 * mode - debug
941 *
942 * Returns: Nothing.
943 *
944 */
945 static void
skd_end_request_abnormal(skd_device_t * skdev,skd_buf_private_t * pbuf,int error,int mode)946 skd_end_request_abnormal(skd_device_t *skdev, skd_buf_private_t *pbuf,
947 int error, int mode)
948 {
949 skd_io_done(skdev, pbuf, error, mode);
950 }
951
952 /*
953 *
954 * Name: skd_request_fn_not_online, handles the condition
955 * of the device not being online.
956 *
957 * Inputs: skdev - device state structure.
958 *
959 * Returns: nothing (void).
960 *
961 */
962 static void
skd_request_fn_not_online(skd_device_t * skdev)963 skd_request_fn_not_online(skd_device_t *skdev)
964 {
965 int error;
966 skd_buf_private_t *pbuf;
967
968 ASSERT(skdev->state != SKD_DRVR_STATE_ONLINE);
969
970 skd_log_skdev(skdev, "req_not_online");
971
972 switch (skdev->state) {
973 case SKD_DRVR_STATE_PAUSING:
974 case SKD_DRVR_STATE_PAUSED:
975 case SKD_DRVR_STATE_STARTING:
976 case SKD_DRVR_STATE_RESTARTING:
977 case SKD_DRVR_STATE_WAIT_BOOT:
978 /*
979 * In case of starting, we haven't started the queue,
980 * so we can't get here... but requests are
981 * possibly hanging out waiting for us because we
982 * reported the dev/skd/0 already. They'll wait
983 * forever if connect doesn't complete.
984 * What to do??? delay dev/skd/0 ??
985 */
986 case SKD_DRVR_STATE_BUSY:
987 case SKD_DRVR_STATE_BUSY_IMMINENT:
988 case SKD_DRVR_STATE_BUSY_ERASE:
989 case SKD_DRVR_STATE_DRAINING_TIMEOUT:
990 return;
991
992 case SKD_DRVR_STATE_BUSY_SANITIZE:
993 case SKD_DRVR_STATE_STOPPING:
994 case SKD_DRVR_STATE_SYNCING:
995 case SKD_DRVR_STATE_FAULT:
996 case SKD_DRVR_STATE_DISAPPEARED:
997 default:
998 error = -EIO;
999 break;
1000 }
1001
1002 /*
1003 * If we get here, terminate all pending block requeusts
1004 * with EIO and any scsi pass thru with appropriate sense
1005 */
1006 ASSERT(WAITQ_LOCK_HELD(skdev));
1007 if (SIMPLEQ_EMPTY(&skdev->waitqueue))
1008 return;
1009
1010 while ((pbuf = skd_get_queued_pbuf(skdev)))
1011 skd_end_request_abnormal(skdev, pbuf, error, SKD_IODONE_WNIOC);
1012
1013 cv_signal(&skdev->cv_waitq);
1014 }
1015
1016 /*
1017 * TIMER
1018 */
1019
1020 static void skd_timer_tick_not_online(struct skd_device *skdev);
1021
1022 /*
1023 *
1024 * Name: skd_timer_tick, monitors requests for timeouts.
1025 *
1026 * Inputs: skdev - device state structure.
1027 *
1028 * Returns: Nothing.
1029 *
1030 */
1031 static void
skd_timer_tick(skd_device_t * skdev)1032 skd_timer_tick(skd_device_t *skdev)
1033 {
1034 uint32_t timo_slot;
1035
1036 skdev->timer_active = 1;
1037
1038 if (skdev->state != SKD_DRVR_STATE_ONLINE) {
1039 skd_timer_tick_not_online(skdev);
1040 goto timer_func_out;
1041 }
1042
1043 skdev->timeout_stamp++;
1044 timo_slot = skdev->timeout_stamp & SKD_TIMEOUT_SLOT_MASK;
1045
1046 /*
1047 * All requests that happened during the previous use of
1048 * this slot should be done by now. The previous use was
1049 * over 7 seconds ago.
1050 */
1051 if (skdev->timeout_slot[timo_slot] == 0) {
1052 goto timer_func_out;
1053 }
1054
1055 /* Something is overdue */
1056 Dcmn_err(CE_NOTE, "found %d timeouts, draining busy=%d",
1057 skdev->timeout_slot[timo_slot],
1058 skdev->queue_depth_busy);
1059 skdev->timer_countdown = SKD_TIMER_SECONDS(3);
1060 skdev->state = SKD_DRVR_STATE_DRAINING_TIMEOUT;
1061 skdev->timo_slot = timo_slot;
1062
1063 timer_func_out:
1064 skdev->timer_active = 0;
1065 }
1066
1067 /*
1068 *
1069 * Name: skd_timer_tick_not_online, handles various device
1070 * state transitions.
1071 *
1072 * Inputs: skdev - device state structure.
1073 *
1074 * Returns: Nothing.
1075 *
1076 */
1077 static void
skd_timer_tick_not_online(struct skd_device * skdev)1078 skd_timer_tick_not_online(struct skd_device *skdev)
1079 {
1080 Dcmn_err(CE_NOTE, "skd_skd_timer_tick_not_online: state=%d tmo=%d",
1081 skdev->state, skdev->timer_countdown);
1082
1083 ASSERT(skdev->state != SKD_DRVR_STATE_ONLINE);
1084
1085 switch (skdev->state) {
1086 case SKD_DRVR_STATE_IDLE:
1087 case SKD_DRVR_STATE_LOAD:
1088 break;
1089 case SKD_DRVR_STATE_BUSY_SANITIZE:
1090 cmn_err(CE_WARN, "!drive busy sanitize[%x], driver[%x]\n",
1091 skdev->drive_state, skdev->state);
1092 break;
1093
1094 case SKD_DRVR_STATE_BUSY:
1095 case SKD_DRVR_STATE_BUSY_IMMINENT:
1096 case SKD_DRVR_STATE_BUSY_ERASE:
1097 Dcmn_err(CE_NOTE, "busy[%x], countdown=%d\n",
1098 skdev->state, skdev->timer_countdown);
1099 if (skdev->timer_countdown > 0) {
1100 skdev->timer_countdown--;
1101 return;
1102 }
1103 cmn_err(CE_WARN, "!busy[%x], timedout=%d, restarting device.",
1104 skdev->state, skdev->timer_countdown);
1105 skd_restart_device(skdev);
1106 break;
1107
1108 case SKD_DRVR_STATE_WAIT_BOOT:
1109 case SKD_DRVR_STATE_STARTING:
1110 if (skdev->timer_countdown > 0) {
1111 skdev->timer_countdown--;
1112 return;
1113 }
1114 /*
1115 * For now, we fault the drive. Could attempt resets to
1116 * revcover at some point.
1117 */
1118 skdev->state = SKD_DRVR_STATE_FAULT;
1119
1120 cmn_err(CE_WARN, "!(%s): DriveFault Connect Timeout (%x)",
1121 skd_name(skdev), skdev->drive_state);
1122
1123 /* start the queue so we can respond with error to requests */
1124 skd_start(skdev);
1125
1126 /* wakeup anyone waiting for startup complete */
1127 skdev->gendisk_on = -1;
1128
1129 cv_signal(&skdev->cv_waitq);
1130 break;
1131
1132
1133 case SKD_DRVR_STATE_PAUSING:
1134 case SKD_DRVR_STATE_PAUSED:
1135 break;
1136
1137 case SKD_DRVR_STATE_DRAINING_TIMEOUT:
1138 cmn_err(CE_WARN,
1139 "!%s: draining busy [%d] tick[%d] qdb[%d] tmls[%d]\n",
1140 skdev->name,
1141 skdev->timo_slot,
1142 skdev->timer_countdown,
1143 skdev->queue_depth_busy,
1144 skdev->timeout_slot[skdev->timo_slot]);
1145 /* if the slot has cleared we can let the I/O continue */
1146 if (skdev->timeout_slot[skdev->timo_slot] == 0) {
1147 Dcmn_err(CE_NOTE, "Slot drained, starting queue.");
1148 skdev->state = SKD_DRVR_STATE_ONLINE;
1149 skd_start(skdev);
1150 return;
1151 }
1152 if (skdev->timer_countdown > 0) {
1153 skdev->timer_countdown--;
1154 return;
1155 }
1156 skd_restart_device(skdev);
1157 break;
1158
1159 case SKD_DRVR_STATE_RESTARTING:
1160 if (skdev->timer_countdown > 0) {
1161 skdev->timer_countdown--;
1162
1163 return;
1164 }
1165 /*
1166 * For now, we fault the drive. Could attempt resets to
1167 * revcover at some point.
1168 */
1169 skdev->state = SKD_DRVR_STATE_FAULT;
1170 cmn_err(CE_WARN, "!(%s): DriveFault Reconnect Timeout (%x)\n",
1171 skd_name(skdev), skdev->drive_state);
1172
1173 /*
1174 * Recovering does two things:
1175 * 1. completes IO with error
1176 * 2. reclaims dma resources
1177 * When is it safe to recover requests?
1178 * - if the drive state is faulted
1179 * - if the state is still soft reset after out timeout
1180 * - if the drive registers are dead (state = FF)
1181 */
1182
1183 if ((skdev->drive_state == FIT_SR_DRIVE_SOFT_RESET) ||
1184 (skdev->drive_state == FIT_SR_DRIVE_FAULT) ||
1185 (skdev->drive_state == FIT_SR_DRIVE_STATE_MASK)) {
1186 /*
1187 * It never came out of soft reset. Try to
1188 * recover the requests and then let them
1189 * fail. This is to mitigate hung processes.
1190 *
1191 * Acquire the interrupt lock since these lists are
1192 * manipulated by interrupt handlers.
1193 */
1194 ASSERT(!WAITQ_LOCK_HELD(skdev));
1195 INTR_LOCK(skdev);
1196 skd_recover_requests(skdev);
1197 INTR_UNLOCK(skdev);
1198 }
1199 /* start the queue so we can respond with error to requests */
1200 skd_start(skdev);
1201 /* wakeup anyone waiting for startup complete */
1202 skdev->gendisk_on = -1;
1203 cv_signal(&skdev->cv_waitq);
1204 break;
1205
1206 case SKD_DRVR_STATE_RESUMING:
1207 case SKD_DRVR_STATE_STOPPING:
1208 case SKD_DRVR_STATE_SYNCING:
1209 case SKD_DRVR_STATE_FAULT:
1210 case SKD_DRVR_STATE_DISAPPEARED:
1211 default:
1212 break;
1213 }
1214 }
1215
1216 /*
1217 *
1218 * Name: skd_timer, kicks off the timer processing.
1219 *
1220 * Inputs: skdev - device state structure.
1221 *
1222 * Returns: Nothing.
1223 *
1224 */
1225 static void
skd_timer(void * arg)1226 skd_timer(void *arg)
1227 {
1228 skd_device_t *skdev = (skd_device_t *)arg;
1229
1230 /* Someone set us to 0, don't bother rescheduling. */
1231 ADAPTER_STATE_LOCK(skdev);
1232 if (skdev->skd_timer_timeout_id != 0) {
1233 ADAPTER_STATE_UNLOCK(skdev);
1234 /* Pardon the drop-and-then-acquire logic here. */
1235 skd_timer_tick(skdev);
1236 ADAPTER_STATE_LOCK(skdev);
1237 /* Restart timer, if not being stopped. */
1238 if (skdev->skd_timer_timeout_id != 0) {
1239 skdev->skd_timer_timeout_id =
1240 timeout(skd_timer, arg, skd_timer_ticks);
1241 }
1242 }
1243 ADAPTER_STATE_UNLOCK(skdev);
1244 }
1245
1246 /*
1247 *
1248 * Name: skd_start_timer, kicks off the 1-second timer.
1249 *
1250 * Inputs: skdev - device state structure.
1251 *
1252 * Returns: Zero.
1253 *
1254 */
1255 static void
skd_start_timer(struct skd_device * skdev)1256 skd_start_timer(struct skd_device *skdev)
1257 {
1258 /* Start one second driver timer. */
1259 ADAPTER_STATE_LOCK(skdev);
1260 ASSERT(skdev->skd_timer_timeout_id == 0);
1261
1262 /*
1263 * Do first "timeout tick" right away, but not in this
1264 * thread.
1265 */
1266 skdev->skd_timer_timeout_id = timeout(skd_timer, skdev, 1);
1267 ADAPTER_STATE_UNLOCK(skdev);
1268 }
1269
1270 /*
1271 * INTERNAL REQUESTS -- generated by driver itself
1272 */
1273
1274 /*
1275 *
1276 * Name: skd_format_internal_skspcl, setups the internal
1277 * FIT request message.
1278 *
1279 * Inputs: skdev - device state structure.
1280 *
1281 * Returns: One.
1282 *
1283 */
1284 static int
skd_format_internal_skspcl(struct skd_device * skdev)1285 skd_format_internal_skspcl(struct skd_device *skdev)
1286 {
1287 struct skd_special_context *skspcl = &skdev->internal_skspcl;
1288 struct fit_sg_descriptor *sgd = &skspcl->req.sksg_list[0];
1289 struct fit_msg_hdr *fmh;
1290 uint64_t dma_address;
1291 struct skd_scsi_request *scsi;
1292
1293 fmh = (struct fit_msg_hdr *)&skspcl->msg_buf64[0];
1294 fmh->protocol_id = FIT_PROTOCOL_ID_SOFIT;
1295 fmh->num_protocol_cmds_coalesced = 1;
1296
1297 /* Instead of 64-bytes in, use 8-(64-bit-words) for linted alignment. */
1298 scsi = (struct skd_scsi_request *)&skspcl->msg_buf64[8];
1299 bzero(scsi, sizeof (*scsi));
1300 dma_address = skspcl->req.sksg_dma_address.cookies->_dmu._dmac_ll;
1301 scsi->hdr.sg_list_dma_address = cpu_to_be64(dma_address);
1302 sgd->control = FIT_SGD_CONTROL_LAST;
1303 sgd->byte_count = 0;
1304 sgd->host_side_addr = skspcl->db_dma_address.cookies->_dmu._dmac_ll;
1305 sgd->dev_side_addr = 0; /* not used */
1306 sgd->next_desc_ptr = 0LL;
1307
1308 return (1);
1309 }
1310
1311 /*
1312 *
1313 * Name: skd_send_internal_skspcl, send internal requests to
1314 * the hardware.
1315 *
1316 * Inputs: skdev - device state structure.
1317 * skspcl - request structure
1318 * opcode - just what it says
1319 *
1320 * Returns: Nothing.
1321 *
1322 */
1323 void
skd_send_internal_skspcl(struct skd_device * skdev,struct skd_special_context * skspcl,uint8_t opcode)1324 skd_send_internal_skspcl(struct skd_device *skdev,
1325 struct skd_special_context *skspcl, uint8_t opcode)
1326 {
1327 struct fit_sg_descriptor *sgd = &skspcl->req.sksg_list[0];
1328 struct skd_scsi_request *scsi;
1329
1330 if (SKD_REQ_STATE_IDLE != skspcl->req.state) {
1331 /*
1332 * A refresh is already in progress.
1333 * Just wait for it to finish.
1334 */
1335 return;
1336 }
1337
1338 ASSERT(0 == (skspcl->req.id & SKD_ID_INCR));
1339 skspcl->req.state = SKD_REQ_STATE_BUSY;
1340 skspcl->req.id += SKD_ID_INCR;
1341
1342 /* Instead of 64-bytes in, use 8-(64-bit-words) for linted alignment. */
1343 scsi = (struct skd_scsi_request *)&skspcl->msg_buf64[8];
1344 scsi->hdr.tag = skspcl->req.id;
1345
1346 Dcmn_err(CE_NOTE, "internal skspcl: opcode=%x req.id=%x ==========>",
1347 opcode, skspcl->req.id);
1348
1349 switch (opcode) {
1350 case TEST_UNIT_READY:
1351 scsi->cdb[0] = TEST_UNIT_READY;
1352 scsi->cdb[1] = 0x00;
1353 scsi->cdb[2] = 0x00;
1354 scsi->cdb[3] = 0x00;
1355 scsi->cdb[4] = 0x00;
1356 scsi->cdb[5] = 0x00;
1357 sgd->byte_count = 0;
1358 scsi->hdr.sg_list_len_bytes = 0;
1359 break;
1360 case READ_CAPACITY_EXT:
1361 scsi->cdb[0] = READ_CAPACITY_EXT;
1362 scsi->cdb[1] = 0x10;
1363 scsi->cdb[2] = 0x00;
1364 scsi->cdb[3] = 0x00;
1365 scsi->cdb[4] = 0x00;
1366 scsi->cdb[5] = 0x00;
1367 scsi->cdb[6] = 0x00;
1368 scsi->cdb[7] = 0x00;
1369 scsi->cdb[8] = 0x00;
1370 scsi->cdb[9] = 0x00;
1371 scsi->cdb[10] = 0x00;
1372 scsi->cdb[11] = 0x00;
1373 scsi->cdb[12] = 0x00;
1374 scsi->cdb[13] = 0x20;
1375 scsi->cdb[14] = 0x00;
1376 scsi->cdb[15] = 0x00;
1377 sgd->byte_count = SKD_N_READ_CAP_EXT_BYTES;
1378 scsi->hdr.sg_list_len_bytes = cpu_to_be32(sgd->byte_count);
1379 break;
1380 case 0x28:
1381 (void) memset(skspcl->data_buf, 0x65, SKD_N_INTERNAL_BYTES);
1382
1383 scsi->cdb[0] = 0x28;
1384 scsi->cdb[1] = 0x00;
1385 scsi->cdb[2] = 0x00;
1386 scsi->cdb[3] = 0x00;
1387 scsi->cdb[4] = 0x00;
1388 scsi->cdb[5] = 0x00;
1389 scsi->cdb[6] = 0x00;
1390 scsi->cdb[7] = 0x00;
1391 scsi->cdb[8] = 0x01;
1392 scsi->cdb[9] = 0x00;
1393 sgd->byte_count = SKD_N_INTERNAL_BYTES;
1394 scsi->hdr.sg_list_len_bytes = cpu_to_be32(SKD_N_INTERNAL_BYTES);
1395 break;
1396 case INQUIRY:
1397 scsi->cdb[0] = INQUIRY;
1398 scsi->cdb[1] = 0x01; /* evpd */
1399 scsi->cdb[2] = 0x80; /* serial number page */
1400 scsi->cdb[3] = 0x00;
1401 scsi->cdb[4] = 0x10;
1402 scsi->cdb[5] = 0x00;
1403 sgd->byte_count = 16; /* SKD_N_INQ_BYTES */;
1404 scsi->hdr.sg_list_len_bytes = cpu_to_be32(sgd->byte_count);
1405 break;
1406 case INQUIRY2:
1407 scsi->cdb[0] = INQUIRY;
1408 scsi->cdb[1] = 0x00;
1409 scsi->cdb[2] = 0x00; /* serial number page */
1410 scsi->cdb[3] = 0x00;
1411 scsi->cdb[4] = 0x24;
1412 scsi->cdb[5] = 0x00;
1413 sgd->byte_count = 36; /* SKD_N_INQ_BYTES */;
1414 scsi->hdr.sg_list_len_bytes = cpu_to_be32(sgd->byte_count);
1415 break;
1416 case SYNCHRONIZE_CACHE:
1417 scsi->cdb[0] = SYNCHRONIZE_CACHE;
1418 scsi->cdb[1] = 0x00;
1419 scsi->cdb[2] = 0x00;
1420 scsi->cdb[3] = 0x00;
1421 scsi->cdb[4] = 0x00;
1422 scsi->cdb[5] = 0x00;
1423 scsi->cdb[6] = 0x00;
1424 scsi->cdb[7] = 0x00;
1425 scsi->cdb[8] = 0x00;
1426 scsi->cdb[9] = 0x00;
1427 sgd->byte_count = 0;
1428 scsi->hdr.sg_list_len_bytes = 0;
1429 break;
1430 default:
1431 ASSERT("Don't know what to send");
1432 return;
1433
1434 }
1435
1436 skd_send_special_fitmsg(skdev, skspcl);
1437 }
1438
1439 /*
1440 *
1441 * Name: skd_refresh_device_data, sends a TUR command.
1442 *
1443 * Inputs: skdev - device state structure.
1444 *
1445 * Returns: Nothing.
1446 *
1447 */
1448 static void
skd_refresh_device_data(struct skd_device * skdev)1449 skd_refresh_device_data(struct skd_device *skdev)
1450 {
1451 struct skd_special_context *skspcl = &skdev->internal_skspcl;
1452
1453 Dcmn_err(CE_NOTE, "refresh_device_data: state=%d", skdev->state);
1454
1455 skd_send_internal_skspcl(skdev, skspcl, TEST_UNIT_READY);
1456 }
1457
1458 /*
1459 *
1460 * Name: skd_complete_internal, handles the completion of
1461 * driver-initiated I/O requests.
1462 *
1463 * Inputs: skdev - device state structure.
1464 * skcomp - completion structure.
1465 * skerr - error structure.
1466 * skspcl - request structure.
1467 *
1468 * Returns: Nothing.
1469 *
1470 */
1471 /* ARGSUSED */ /* Upstream common source with other platforms. */
1472 static void
skd_complete_internal(struct skd_device * skdev,volatile struct fit_completion_entry_v1 * skcomp,volatile struct fit_comp_error_info * skerr,struct skd_special_context * skspcl)1473 skd_complete_internal(struct skd_device *skdev,
1474 volatile struct fit_completion_entry_v1 *skcomp,
1475 volatile struct fit_comp_error_info *skerr,
1476 struct skd_special_context *skspcl)
1477 {
1478 uint8_t *buf = skspcl->data_buf;
1479 uint8_t status = 2;
1480 /* Instead of 64-bytes in, use 8-(64-bit-words) for linted alignment. */
1481 struct skd_scsi_request *scsi =
1482 (struct skd_scsi_request *)&skspcl->msg_buf64[8];
1483
1484 ASSERT(skspcl == &skdev->internal_skspcl);
1485
1486 (void) ddi_dma_sync(skspcl->db_dma_address.dma_handle, 0, 0,
1487 DDI_DMA_SYNC_FORKERNEL);
1488 (void) ddi_dma_sync(skspcl->mb_dma_address.dma_handle, 0, 0,
1489 DDI_DMA_SYNC_FORKERNEL);
1490
1491 Dcmn_err(CE_NOTE, "complete internal %x", scsi->cdb[0]);
1492
1493 skspcl->req.completion = *skcomp;
1494 skspcl->req.state = SKD_REQ_STATE_IDLE;
1495 skspcl->req.id += SKD_ID_INCR;
1496
1497 status = skspcl->req.completion.status;
1498
1499 Dcmn_err(CE_NOTE, "<<<<====== complete_internal: opc=%x", *scsi->cdb);
1500
1501 switch (scsi->cdb[0]) {
1502 case TEST_UNIT_READY:
1503 if (SAM_STAT_GOOD == status) {
1504 skd_send_internal_skspcl(skdev, skspcl,
1505 READ_CAPACITY_EXT);
1506 } else {
1507 if (skdev->state == SKD_DRVR_STATE_STOPPING) {
1508 cmn_err(CE_WARN,
1509 "!%s: TUR failed, don't send anymore"
1510 "state 0x%x", skdev->name, skdev->state);
1511
1512 return;
1513 }
1514
1515 Dcmn_err(CE_NOTE, "%s: TUR failed, retry skerr",
1516 skdev->name);
1517 skd_send_internal_skspcl(skdev, skspcl, 0x00);
1518 }
1519 break;
1520 case READ_CAPACITY_EXT: {
1521 uint64_t cap, Nblocks;
1522 uint64_t xbuf[1];
1523
1524 skdev->read_cap_is_valid = 0;
1525 if (SAM_STAT_GOOD == status) {
1526 bcopy(buf, xbuf, 8);
1527 cap = be64_to_cpu(*xbuf);
1528 skdev->read_cap_last_lba = cap;
1529 skdev->read_cap_blocksize =
1530 (buf[8] << 24) | (buf[9] << 16) |
1531 (buf[10] << 8) | buf[11];
1532
1533 cap *= skdev->read_cap_blocksize;
1534 Dcmn_err(CE_NOTE, " Last LBA: %" PRIu64 " (0x%" PRIx64
1535 "), blk sz: %d, Capacity: %" PRIu64 "GB\n",
1536 skdev->read_cap_last_lba,
1537 skdev->read_cap_last_lba,
1538 skdev->read_cap_blocksize,
1539 cap >> 30ULL);
1540
1541 Nblocks = skdev->read_cap_last_lba + 1;
1542
1543 skdev->Nblocks = Nblocks;
1544 skdev->read_cap_is_valid = 1;
1545
1546 skd_send_internal_skspcl(skdev, skspcl, INQUIRY2);
1547
1548 } else {
1549 Dcmn_err(CE_NOTE, "**** READCAP failed, retry TUR");
1550 skd_send_internal_skspcl(skdev, skspcl,
1551 TEST_UNIT_READY);
1552 }
1553 break;
1554 }
1555 case INQUIRY:
1556 skdev->inquiry_is_valid = 0;
1557 if (SAM_STAT_GOOD == status) {
1558 skdev->inquiry_is_valid = 1;
1559
1560 if (scsi->cdb[1] == 0x1) {
1561 bcopy(&buf[4], skdev->inq_serial_num, 12);
1562 skdev->inq_serial_num[12] = '\0';
1563 } else {
1564 char *tmp = skdev->inq_vendor_id;
1565
1566 bcopy(&buf[8], tmp, 8);
1567 tmp[8] = '\0';
1568
1569 tmp = skdev->inq_product_id;
1570 bcopy(&buf[16], tmp, 16);
1571 tmp[16] = '\0';
1572
1573 tmp = skdev->inq_product_rev;
1574 bcopy(&buf[32], tmp, 4);
1575 tmp[4] = '\0';
1576 }
1577 }
1578
1579 if (skdev->state != SKD_DRVR_STATE_ONLINE)
1580 if (skd_unquiesce_dev(skdev) < 0)
1581 cmn_err(CE_NOTE, "** failed, to ONLINE device");
1582 break;
1583 case SYNCHRONIZE_CACHE:
1584 skdev->sync_done = (SAM_STAT_GOOD == status) ? 1 : -1;
1585
1586 cv_signal(&skdev->cv_waitq);
1587 break;
1588
1589 default:
1590 ASSERT("we didn't send this");
1591 }
1592 }
1593
1594 /*
1595 * FIT MESSAGES
1596 */
1597
1598 /*
1599 *
1600 * Name: skd_send_fitmsg, send a FIT message to the hardware.
1601 *
1602 * Inputs: skdev - device state structure.
1603 * skmsg - FIT message structure.
1604 *
1605 * Returns: Nothing.
1606 *
1607 */
1608 /* ARGSUSED */ /* Upstream common source with other platforms. */
1609 static void
skd_send_fitmsg(struct skd_device * skdev,struct skd_fitmsg_context * skmsg)1610 skd_send_fitmsg(struct skd_device *skdev,
1611 struct skd_fitmsg_context *skmsg)
1612 {
1613 uint64_t qcmd;
1614 struct fit_msg_hdr *fmh;
1615
1616 Dcmn_err(CE_NOTE, "msgbuf's DMA addr: 0x%" PRIx64 ", qdepth_busy=%d",
1617 skmsg->mb_dma_address.cookies->dmac_laddress,
1618 skdev->queue_depth_busy);
1619
1620 Dcmn_err(CE_NOTE, "msg_buf 0x%p, offset %x", (void *)skmsg->msg_buf,
1621 skmsg->offset);
1622
1623 qcmd = skmsg->mb_dma_address.cookies->dmac_laddress;
1624 qcmd |= FIT_QCMD_QID_NORMAL;
1625
1626 fmh = (struct fit_msg_hdr *)skmsg->msg_buf64;
1627 skmsg->outstanding = fmh->num_protocol_cmds_coalesced;
1628
1629 if (skdev->dbg_level > 1) {
1630 uint8_t *bp = skmsg->msg_buf;
1631 int i;
1632
1633 for (i = 0; i < skmsg->length; i += 8) {
1634 Dcmn_err(CE_NOTE, " msg[%2d] %02x %02x %02x %02x "
1635 "%02x %02x %02x %02x",
1636 i, bp[i + 0], bp[i + 1], bp[i + 2],
1637 bp[i + 3], bp[i + 4], bp[i + 5],
1638 bp[i + 6], bp[i + 7]);
1639 if (i == 0) i = 64 - 8;
1640 }
1641 }
1642
1643 (void) ddi_dma_sync(skmsg->mb_dma_address.dma_handle, 0, 0,
1644 DDI_DMA_SYNC_FORDEV);
1645
1646 ASSERT(skmsg->length > sizeof (struct fit_msg_hdr));
1647 if (skmsg->length > 256) {
1648 qcmd |= FIT_QCMD_MSGSIZE_512;
1649 } else if (skmsg->length > 128) {
1650 qcmd |= FIT_QCMD_MSGSIZE_256;
1651 } else if (skmsg->length > 64) {
1652 qcmd |= FIT_QCMD_MSGSIZE_128;
1653 }
1654
1655 skdev->ios_started++;
1656
1657 SKD_WRITEQ(skdev, qcmd, FIT_Q_COMMAND);
1658 }
1659
1660 /*
1661 *
1662 * Name: skd_send_special_fitmsg, send a special FIT message
1663 * to the hardware used driver-originated I/O requests.
1664 *
1665 * Inputs: skdev - device state structure.
1666 * skspcl - skspcl structure.
1667 *
1668 * Returns: Nothing.
1669 *
1670 */
1671 static void
skd_send_special_fitmsg(struct skd_device * skdev,struct skd_special_context * skspcl)1672 skd_send_special_fitmsg(struct skd_device *skdev,
1673 struct skd_special_context *skspcl)
1674 {
1675 uint64_t qcmd;
1676
1677 Dcmn_err(CE_NOTE, "send_special_fitmsg: pt 1");
1678
1679 if (skdev->dbg_level > 1) {
1680 uint8_t *bp = skspcl->msg_buf;
1681 int i;
1682
1683 for (i = 0; i < SKD_N_SPECIAL_FITMSG_BYTES; i += 8) {
1684 cmn_err(CE_NOTE,
1685 " spcl[%2d] %02x %02x %02x %02x "
1686 "%02x %02x %02x %02x\n", i,
1687 bp[i + 0], bp[i + 1], bp[i + 2], bp[i + 3],
1688 bp[i + 4], bp[i + 5], bp[i + 6], bp[i + 7]);
1689 if (i == 0) i = 64 - 8;
1690 }
1691
1692 for (i = 0; i < skspcl->req.n_sg; i++) {
1693 struct fit_sg_descriptor *sgd =
1694 &skspcl->req.sksg_list[i];
1695
1696 cmn_err(CE_NOTE, " sg[%d] count=%u ctrl=0x%x "
1697 "addr=0x%" PRIx64 " next=0x%" PRIx64,
1698 i, sgd->byte_count, sgd->control,
1699 sgd->host_side_addr, sgd->next_desc_ptr);
1700 }
1701 }
1702
1703 (void) ddi_dma_sync(skspcl->mb_dma_address.dma_handle, 0, 0,
1704 DDI_DMA_SYNC_FORDEV);
1705 (void) ddi_dma_sync(skspcl->db_dma_address.dma_handle, 0, 0,
1706 DDI_DMA_SYNC_FORDEV);
1707
1708 /*
1709 * Special FIT msgs are always 128 bytes: a 64-byte FIT hdr
1710 * and one 64-byte SSDI command.
1711 */
1712 qcmd = skspcl->mb_dma_address.cookies->dmac_laddress;
1713
1714 qcmd |= FIT_QCMD_QID_NORMAL + FIT_QCMD_MSGSIZE_128;
1715
1716 SKD_WRITEQ(skdev, qcmd, FIT_Q_COMMAND);
1717 }
1718
1719 /*
1720 * COMPLETION QUEUE
1721 */
1722
1723 static void skd_complete_other(struct skd_device *skdev,
1724 volatile struct fit_completion_entry_v1 *skcomp,
1725 volatile struct fit_comp_error_info *skerr);
1726
1727 struct sns_info {
1728 uint8_t type;
1729 uint8_t stat;
1730 uint8_t key;
1731 uint8_t asc;
1732 uint8_t ascq;
1733 uint8_t mask;
1734 enum skd_check_status_action action;
1735 };
1736
1737 static struct sns_info skd_chkstat_table[] = {
1738 /* Good */
1739 {0x70, 0x02, RECOVERED_ERROR, 0, 0, 0x1c, SKD_CHECK_STATUS_REPORT_GOOD},
1740
1741 /* Smart alerts */
1742 {0x70, 0x02, NO_SENSE, 0x0B, 0x00, 0x1E, /* warnings */
1743 SKD_CHECK_STATUS_REPORT_SMART_ALERT},
1744 {0x70, 0x02, NO_SENSE, 0x5D, 0x00, 0x1E, /* thresholds */
1745 SKD_CHECK_STATUS_REPORT_SMART_ALERT},
1746 {0x70, 0x02, RECOVERED_ERROR, 0x0B, 0x01, 0x1F, /* temp over trigger */
1747 SKD_CHECK_STATUS_REPORT_SMART_ALERT},
1748
1749 /* Retry (with limits) */
1750 {0x70, 0x02, ABORTED_COMMAND, 0, 0, 0x1C, /* DMA errors */
1751 SKD_CHECK_STATUS_REQUEUE_REQUEST},
1752 {0x70, 0x02, UNIT_ATTENTION, 0x0B, 0x00, 0x1E, /* warnings */
1753 SKD_CHECK_STATUS_REQUEUE_REQUEST},
1754 {0x70, 0x02, UNIT_ATTENTION, 0x5D, 0x00, 0x1E, /* thresholds */
1755 SKD_CHECK_STATUS_REQUEUE_REQUEST},
1756 {0x70, 0x02, UNIT_ATTENTION, 0x80, 0x30, 0x1F, /* backup power */
1757 SKD_CHECK_STATUS_REQUEUE_REQUEST},
1758
1759 /* Busy (or about to be) */
1760 {0x70, 0x02, UNIT_ATTENTION, 0x3f, 0x01, 0x1F, /* fw changed */
1761 SKD_CHECK_STATUS_BUSY_IMMINENT},
1762 };
1763
1764 /*
1765 *
1766 * Name: skd_check_status, checks the return status from a
1767 * completed I/O request.
1768 *
1769 * Inputs: skdev - device state structure.
1770 * cmp_status - SCSI status byte.
1771 * skerr - the error data structure.
1772 *
1773 * Returns: Depending on the error condition, return the action
1774 * to be taken as specified in the skd_chkstat_table.
1775 * If no corresponding value is found in the table
1776 * return SKD_CHECK_STATUS_REPORT_GOOD is no error otherwise
1777 * return SKD_CHECK_STATUS_REPORT_ERROR.
1778 *
1779 */
1780 static enum skd_check_status_action
skd_check_status(struct skd_device * skdev,uint8_t cmp_status,volatile struct fit_comp_error_info * skerr)1781 skd_check_status(struct skd_device *skdev, uint8_t cmp_status,
1782 volatile struct fit_comp_error_info *skerr)
1783 {
1784 /*
1785 * Look up status and sense data to decide how to handle the error
1786 * from the device.
1787 * mask says which fields must match e.g., mask=0x18 means check
1788 * type and stat, ignore key, asc, ascq.
1789 */
1790 int i, n;
1791
1792 Dcmn_err(CE_NOTE, "(%s): key/asc/ascq %02x/%02x/%02x",
1793 skd_name(skdev), skerr->key, skerr->code, skerr->qual);
1794
1795 Dcmn_err(CE_NOTE, "stat: t=%02x stat=%02x k=%02x c=%02x q=%02x",
1796 skerr->type, cmp_status, skerr->key, skerr->code, skerr->qual);
1797
1798 /* Does the info match an entry in the good category? */
1799 n = sizeof (skd_chkstat_table) / sizeof (skd_chkstat_table[0]);
1800 for (i = 0; i < n; i++) {
1801 struct sns_info *sns = &skd_chkstat_table[i];
1802
1803 if (sns->mask & 0x10)
1804 if (skerr->type != sns->type) continue;
1805
1806 if (sns->mask & 0x08)
1807 if (cmp_status != sns->stat) continue;
1808
1809 if (sns->mask & 0x04)
1810 if (skerr->key != sns->key) continue;
1811
1812 if (sns->mask & 0x02)
1813 if (skerr->code != sns->asc) continue;
1814
1815 if (sns->mask & 0x01)
1816 if (skerr->qual != sns->ascq) continue;
1817
1818 if (sns->action == SKD_CHECK_STATUS_REPORT_SMART_ALERT) {
1819 cmn_err(CE_WARN, "!(%s):SMART Alert: sense key/asc/ascq"
1820 " %02x/%02x/%02x",
1821 skd_name(skdev), skerr->key,
1822 skerr->code, skerr->qual);
1823 }
1824
1825 Dcmn_err(CE_NOTE, "skd_check_status: returning %x",
1826 sns->action);
1827
1828 return (sns->action);
1829 }
1830
1831 /*
1832 * No other match, so nonzero status means error,
1833 * zero status means good
1834 */
1835 if (cmp_status) {
1836 cmn_err(CE_WARN,
1837 "!%s: status check: qdepth=%d skmfl=%p (%d) skrfl=%p (%d)",
1838 skdev->name,
1839 skdev->queue_depth_busy,
1840 (void *)skdev->skmsg_free_list, skd_list_skmsg(skdev, 0),
1841 (void *)skdev->skreq_free_list, skd_list_skreq(skdev, 0));
1842
1843 cmn_err(CE_WARN, "!%s: t=%02x stat=%02x k=%02x c=%02x q=%02x",
1844 skdev->name, skerr->type, cmp_status, skerr->key,
1845 skerr->code, skerr->qual);
1846
1847 return (SKD_CHECK_STATUS_REPORT_ERROR);
1848 }
1849
1850 Dcmn_err(CE_NOTE, "status check good default");
1851
1852 return (SKD_CHECK_STATUS_REPORT_GOOD);
1853 }
1854
1855 /*
1856 *
1857 * Name: skd_isr_completion_posted, handles I/O completions.
1858 *
1859 * Inputs: skdev - device state structure.
1860 *
1861 * Returns: Nothing.
1862 *
1863 */
1864 static void
skd_isr_completion_posted(struct skd_device * skdev)1865 skd_isr_completion_posted(struct skd_device *skdev)
1866 {
1867 volatile struct fit_completion_entry_v1 *skcmp = NULL;
1868 volatile struct fit_comp_error_info *skerr;
1869 struct skd_fitmsg_context *skmsg;
1870 struct skd_request_context *skreq;
1871 skd_buf_private_t *pbuf;
1872 uint16_t req_id;
1873 uint32_t req_slot;
1874 uint32_t timo_slot;
1875 uint32_t msg_slot;
1876 uint16_t cmp_cntxt = 0;
1877 uint8_t cmp_status = 0;
1878 uint8_t cmp_cycle = 0;
1879 uint32_t cmp_bytes = 0;
1880
1881 (void) ddi_dma_sync(skdev->cq_dma_address.dma_handle, 0, 0,
1882 DDI_DMA_SYNC_FORKERNEL);
1883
1884 for (;;) {
1885 ASSERT(skdev->skcomp_ix < SKD_N_COMPLETION_ENTRY);
1886
1887 WAITQ_LOCK(skdev);
1888
1889 skcmp = &skdev->skcomp_table[skdev->skcomp_ix];
1890 cmp_cycle = skcmp->cycle;
1891 cmp_cntxt = skcmp->tag;
1892 cmp_status = skcmp->status;
1893 cmp_bytes = be32_to_cpu(skcmp->num_returned_bytes);
1894
1895 skerr = &skdev->skerr_table[skdev->skcomp_ix];
1896
1897 Dcmn_err(CE_NOTE,
1898 "cycle=%d ix=%d got cycle=%d cmdctxt=0x%x stat=%d "
1899 "qdepth_busy=%d rbytes=0x%x proto=%d",
1900 skdev->skcomp_cycle, skdev->skcomp_ix,
1901 cmp_cycle, cmp_cntxt, cmp_status,
1902 skdev->queue_depth_busy, cmp_bytes, skdev->proto_ver);
1903
1904 if (cmp_cycle != skdev->skcomp_cycle) {
1905 Dcmn_err(CE_NOTE, "%s:end of completions", skdev->name);
1906
1907 WAITQ_UNLOCK(skdev);
1908 break;
1909 }
1910
1911
1912 skdev->n_req++;
1913
1914 /*
1915 * Update the completion queue head index and possibly
1916 * the completion cycle count.
1917 */
1918 skdev->skcomp_ix++;
1919 if (skdev->skcomp_ix >= SKD_N_COMPLETION_ENTRY) {
1920 skdev->skcomp_ix = 0;
1921 skdev->skcomp_cycle++; /* 8-bit wrap-around */
1922 }
1923
1924
1925 /*
1926 * The command context is a unique 32-bit ID. The low order
1927 * bits help locate the request. The request is usually a
1928 * r/w request (see skd_start() above) or a special request.
1929 */
1930 req_id = cmp_cntxt;
1931 req_slot = req_id & SKD_ID_SLOT_AND_TABLE_MASK;
1932
1933 Dcmn_err(CE_NOTE,
1934 "<<<< completion_posted 1: req_id=%x req_slot=%x",
1935 req_id, req_slot);
1936
1937 /* Is this other than a r/w request? */
1938 if (req_slot >= skdev->num_req_context) {
1939 /*
1940 * This is not a completion for a r/w request.
1941 */
1942 skd_complete_other(skdev, skcmp, skerr);
1943 WAITQ_UNLOCK(skdev);
1944 continue;
1945 }
1946
1947 skreq = &skdev->skreq_table[req_slot];
1948
1949 /*
1950 * Make sure the request ID for the slot matches.
1951 */
1952 ASSERT(skreq->id == req_id);
1953
1954 if (SKD_REQ_STATE_ABORTED == skreq->state) {
1955 Dcmn_err(CE_NOTE, "reclaim req %p id=%04x\n",
1956 (void *)skreq, skreq->id);
1957 /*
1958 * a previously timed out command can
1959 * now be cleaned up
1960 */
1961 msg_slot = skreq->fitmsg_id & SKD_ID_SLOT_MASK;
1962 ASSERT(msg_slot < skdev->num_fitmsg_context);
1963 skmsg = &skdev->skmsg_table[msg_slot];
1964 if (skmsg->id == skreq->fitmsg_id) {
1965 ASSERT(skmsg->outstanding > 0);
1966 skmsg->outstanding--;
1967 if (skmsg->outstanding == 0) {
1968 ASSERT(SKD_MSG_STATE_BUSY ==
1969 skmsg->state);
1970 skmsg->state = SKD_MSG_STATE_IDLE;
1971 skmsg->id += SKD_ID_INCR;
1972 skmsg->next = skdev->skmsg_free_list;
1973 skdev->skmsg_free_list = skmsg;
1974 }
1975 }
1976 /*
1977 * Reclaim the skd_request_context
1978 */
1979 skreq->state = SKD_REQ_STATE_IDLE;
1980 skreq->id += SKD_ID_INCR;
1981 skreq->next = skdev->skreq_free_list;
1982 skdev->skreq_free_list = skreq;
1983 WAITQ_UNLOCK(skdev);
1984 continue;
1985 }
1986
1987 skreq->completion.status = cmp_status;
1988
1989 pbuf = skreq->pbuf;
1990 ASSERT(pbuf != NULL);
1991
1992 Dcmn_err(CE_NOTE, "<<<< completion_posted 2: pbuf=%p "
1993 "req_id=%x req_slot=%x", (void *)pbuf, req_id, req_slot);
1994 if (cmp_status && skdev->disks_initialized) {
1995 cmn_err(CE_WARN, "!%s: "
1996 "I/O err: pbuf=%p blkno=%lld (%llx) nbklks=%ld ",
1997 skdev->name, (void *)pbuf, pbuf->x_xfer->x_blkno,
1998 pbuf->x_xfer->x_blkno, pbuf->x_xfer->x_nblks);
1999 }
2000
2001 ASSERT(skdev->active_cmds);
2002 atomic_dec_64(&skdev->active_cmds);
2003
2004 if (SAM_STAT_GOOD == cmp_status) {
2005 /* Release DMA resources for the request. */
2006 if (pbuf->x_xfer->x_nblks != 0)
2007 skd_blkdev_postop_sg_list(skdev, skreq);
2008 WAITQ_UNLOCK(skdev);
2009 skd_end_request(skdev, skreq, 0);
2010 WAITQ_LOCK(skdev);
2011 } else {
2012 switch (skd_check_status(skdev, cmp_status, skerr)) {
2013 case SKD_CHECK_STATUS_REPORT_GOOD:
2014 case SKD_CHECK_STATUS_REPORT_SMART_ALERT:
2015 WAITQ_UNLOCK(skdev);
2016 skd_end_request(skdev, skreq, 0);
2017 WAITQ_LOCK(skdev);
2018 break;
2019
2020 case SKD_CHECK_STATUS_BUSY_IMMINENT:
2021 skd_log_skreq(skdev, skreq, "retry(busy)");
2022 skd_queue(skdev, pbuf);
2023 skdev->state = SKD_DRVR_STATE_BUSY_IMMINENT;
2024 skdev->timer_countdown = SKD_TIMER_MINUTES(20);
2025
2026 (void) skd_quiesce_dev(skdev);
2027 break;
2028
2029 /* FALLTHRU */
2030 case SKD_CHECK_STATUS_REPORT_ERROR:
2031 /* fall thru to report error */
2032 default:
2033 /*
2034 * Save the entire completion
2035 * and error entries for
2036 * later error interpretation.
2037 */
2038 skreq->completion = *skcmp;
2039 skreq->err_info = *skerr;
2040 WAITQ_UNLOCK(skdev);
2041 skd_end_request(skdev, skreq, -EIO);
2042 WAITQ_LOCK(skdev);
2043 break;
2044 }
2045 }
2046
2047 /*
2048 * Reclaim the FIT msg buffer if this is
2049 * the first of the requests it carried to
2050 * be completed. The FIT msg buffer used to
2051 * send this request cannot be reused until
2052 * we are sure the s1120 card has copied
2053 * it to its memory. The FIT msg might have
2054 * contained several requests. As soon as
2055 * any of them are completed we know that
2056 * the entire FIT msg was transferred.
2057 * Only the first completed request will
2058 * match the FIT msg buffer id. The FIT
2059 * msg buffer id is immediately updated.
2060 * When subsequent requests complete the FIT
2061 * msg buffer id won't match, so we know
2062 * quite cheaply that it is already done.
2063 */
2064 msg_slot = skreq->fitmsg_id & SKD_ID_SLOT_MASK;
2065
2066 ASSERT(msg_slot < skdev->num_fitmsg_context);
2067 skmsg = &skdev->skmsg_table[msg_slot];
2068 if (skmsg->id == skreq->fitmsg_id) {
2069 ASSERT(SKD_MSG_STATE_BUSY == skmsg->state);
2070 skmsg->state = SKD_MSG_STATE_IDLE;
2071 skmsg->id += SKD_ID_INCR;
2072 skmsg->next = skdev->skmsg_free_list;
2073 skdev->skmsg_free_list = skmsg;
2074 }
2075
2076 /*
2077 * Decrease the number of active requests.
2078 * This also decrements the count in the
2079 * timeout slot.
2080 */
2081 timo_slot = skreq->timeout_stamp & SKD_TIMEOUT_SLOT_MASK;
2082 ASSERT(skdev->timeout_slot[timo_slot] > 0);
2083 ASSERT(skdev->queue_depth_busy > 0);
2084
2085 atomic_dec_32(&skdev->timeout_slot[timo_slot]);
2086 atomic_dec_32(&skdev->queue_depth_busy);
2087
2088 /*
2089 * Reclaim the skd_request_context
2090 */
2091 skreq->state = SKD_REQ_STATE_IDLE;
2092 skreq->id += SKD_ID_INCR;
2093 skreq->next = skdev->skreq_free_list;
2094 skdev->skreq_free_list = skreq;
2095
2096 WAITQ_UNLOCK(skdev);
2097
2098 /*
2099 * make sure the lock is held by caller.
2100 */
2101 if ((skdev->state == SKD_DRVR_STATE_PAUSING) &&
2102 (0 == skdev->queue_depth_busy)) {
2103 skdev->state = SKD_DRVR_STATE_PAUSED;
2104 cv_signal(&skdev->cv_waitq);
2105 }
2106 } /* for(;;) */
2107 }
2108
2109 /*
2110 *
2111 * Name: skd_complete_other, handle the completion of a
2112 * non-r/w request.
2113 *
2114 * Inputs: skdev - device state structure.
2115 * skcomp - FIT completion structure.
2116 * skerr - error structure.
2117 *
2118 * Returns: Nothing.
2119 *
2120 */
2121 static void
skd_complete_other(struct skd_device * skdev,volatile struct fit_completion_entry_v1 * skcomp,volatile struct fit_comp_error_info * skerr)2122 skd_complete_other(struct skd_device *skdev,
2123 volatile struct fit_completion_entry_v1 *skcomp,
2124 volatile struct fit_comp_error_info *skerr)
2125 {
2126 uint32_t req_id = 0;
2127 uint32_t req_table;
2128 uint32_t req_slot;
2129 struct skd_special_context *skspcl;
2130
2131 req_id = skcomp->tag;
2132 req_table = req_id & SKD_ID_TABLE_MASK;
2133 req_slot = req_id & SKD_ID_SLOT_MASK;
2134
2135 Dcmn_err(CE_NOTE, "complete_other: table=0x%x id=0x%x slot=%d",
2136 req_table, req_id, req_slot);
2137
2138 /*
2139 * Based on the request id, determine how to dispatch this completion.
2140 * This swich/case is finding the good cases and forwarding the
2141 * completion entry. Errors are reported below the switch.
2142 */
2143 ASSERT(req_table == SKD_ID_INTERNAL);
2144 ASSERT(req_slot == 0);
2145
2146 skspcl = &skdev->internal_skspcl;
2147 ASSERT(skspcl->req.id == req_id);
2148 ASSERT(skspcl->req.state == SKD_REQ_STATE_BUSY);
2149
2150 Dcmn_err(CE_NOTE, "<<<<== complete_other: ID_INTERNAL");
2151 skd_complete_internal(skdev, skcomp, skerr, skspcl);
2152 }
2153
2154 /*
2155 *
2156 * Name: skd_reset_skcomp, does what it says, resetting completion
2157 * tables.
2158 *
2159 * Inputs: skdev - device state structure.
2160 *
2161 * Returns: Nothing.
2162 *
2163 */
2164 static void
skd_reset_skcomp(struct skd_device * skdev)2165 skd_reset_skcomp(struct skd_device *skdev)
2166 {
2167 uint32_t nbytes;
2168
2169 nbytes = sizeof (struct fit_completion_entry_v1) *
2170 SKD_N_COMPLETION_ENTRY;
2171 nbytes += sizeof (struct fit_comp_error_info) * SKD_N_COMPLETION_ENTRY;
2172
2173 if (skdev->skcomp_table)
2174 bzero(skdev->skcomp_table, nbytes);
2175
2176 skdev->skcomp_ix = 0;
2177 skdev->skcomp_cycle = 1;
2178 }
2179
2180
2181
2182 /*
2183 * INTERRUPTS
2184 */
2185
2186 /*
2187 *
2188 * Name: skd_isr_aif, handles the device interrupts.
2189 *
2190 * Inputs: arg - skdev device state structure.
2191 * intvec - not referenced
2192 *
2193 * Returns: DDI_INTR_CLAIMED if interrupt is handled otherwise
2194 * return DDI_INTR_UNCLAIMED.
2195 *
2196 */
2197 /* ARGSUSED */ /* Upstream common source with other platforms. */
2198 static uint_t
skd_isr_aif(caddr_t arg,caddr_t intvec)2199 skd_isr_aif(caddr_t arg, caddr_t intvec)
2200 {
2201 uint32_t intstat;
2202 uint32_t ack;
2203 int rc = DDI_INTR_UNCLAIMED;
2204 struct skd_device *skdev;
2205
2206 skdev = (skd_device_t *)(uintptr_t)arg;
2207
2208 ASSERT(skdev != NULL);
2209
2210 skdev->intr_cntr++;
2211
2212 Dcmn_err(CE_NOTE, "skd_isr_aif: intr=%" PRId64 "\n", skdev->intr_cntr);
2213
2214 for (;;) {
2215
2216 ASSERT(!WAITQ_LOCK_HELD(skdev));
2217 INTR_LOCK(skdev);
2218
2219 intstat = SKD_READL(skdev, FIT_INT_STATUS_HOST);
2220
2221 ack = FIT_INT_DEF_MASK;
2222 ack &= intstat;
2223
2224 Dcmn_err(CE_NOTE, "intstat=0x%x ack=0x%x", intstat, ack);
2225
2226 /*
2227 * As long as there is an int pending on device, keep
2228 * running loop. When none, get out, but if we've never
2229 * done any processing, call completion handler?
2230 */
2231 if (ack == 0) {
2232 /*
2233 * No interrupts on device, but run the completion
2234 * processor anyway?
2235 */
2236 if (rc == DDI_INTR_UNCLAIMED &&
2237 skdev->state == SKD_DRVR_STATE_ONLINE) {
2238 Dcmn_err(CE_NOTE,
2239 "1: Want isr_comp_posted call");
2240 skd_isr_completion_posted(skdev);
2241 }
2242 INTR_UNLOCK(skdev);
2243
2244 break;
2245 }
2246 rc = DDI_INTR_CLAIMED;
2247
2248 SKD_WRITEL(skdev, ack, FIT_INT_STATUS_HOST);
2249
2250 if ((skdev->state != SKD_DRVR_STATE_LOAD) &&
2251 (skdev->state != SKD_DRVR_STATE_STOPPING)) {
2252 if (intstat & FIT_ISH_COMPLETION_POSTED) {
2253 Dcmn_err(CE_NOTE,
2254 "2: Want isr_comp_posted call");
2255 skd_isr_completion_posted(skdev);
2256 }
2257
2258 if (intstat & FIT_ISH_FW_STATE_CHANGE) {
2259 Dcmn_err(CE_NOTE, "isr: fwstate change");
2260
2261 skd_isr_fwstate(skdev);
2262 if (skdev->state == SKD_DRVR_STATE_FAULT ||
2263 skdev->state ==
2264 SKD_DRVR_STATE_DISAPPEARED) {
2265 INTR_UNLOCK(skdev);
2266
2267 return (rc);
2268 }
2269 }
2270
2271 if (intstat & FIT_ISH_MSG_FROM_DEV) {
2272 Dcmn_err(CE_NOTE, "isr: msg_from_dev change");
2273 skd_isr_msg_from_dev(skdev);
2274 }
2275 }
2276
2277 INTR_UNLOCK(skdev);
2278 }
2279
2280 if (!SIMPLEQ_EMPTY(&skdev->waitqueue))
2281 skd_start(skdev);
2282
2283 return (rc);
2284 }
2285
2286 /*
2287 *
2288 * Name: skd_drive_fault, set the drive state to DRV_STATE_FAULT.
2289 *
2290 * Inputs: skdev - device state structure.
2291 *
2292 * Returns: Nothing.
2293 *
2294 */
2295 static void
skd_drive_fault(struct skd_device * skdev)2296 skd_drive_fault(struct skd_device *skdev)
2297 {
2298 skdev->state = SKD_DRVR_STATE_FAULT;
2299 cmn_err(CE_WARN, "!(%s): Drive FAULT\n",
2300 skd_name(skdev));
2301 }
2302
2303 /*
2304 *
2305 * Name: skd_drive_disappeared, set the drive state to DISAPPEARED..
2306 *
2307 * Inputs: skdev - device state structure.
2308 *
2309 * Returns: Nothing.
2310 *
2311 */
2312 static void
skd_drive_disappeared(struct skd_device * skdev)2313 skd_drive_disappeared(struct skd_device *skdev)
2314 {
2315 skdev->state = SKD_DRVR_STATE_DISAPPEARED;
2316 cmn_err(CE_WARN, "!(%s): Drive DISAPPEARED\n",
2317 skd_name(skdev));
2318 }
2319
2320 /*
2321 *
2322 * Name: skd_isr_fwstate, handles the various device states.
2323 *
2324 * Inputs: skdev - device state structure.
2325 *
2326 * Returns: Nothing.
2327 *
2328 */
2329 static void
skd_isr_fwstate(struct skd_device * skdev)2330 skd_isr_fwstate(struct skd_device *skdev)
2331 {
2332 uint32_t sense;
2333 uint32_t state;
2334 int prev_driver_state;
2335 uint32_t mtd;
2336
2337 prev_driver_state = skdev->state;
2338
2339 sense = SKD_READL(skdev, FIT_STATUS);
2340 state = sense & FIT_SR_DRIVE_STATE_MASK;
2341
2342 Dcmn_err(CE_NOTE, "s1120 state %s(%d)=>%s(%d)",
2343 skd_drive_state_to_str(skdev->drive_state), skdev->drive_state,
2344 skd_drive_state_to_str(state), state);
2345
2346 skdev->drive_state = state;
2347
2348 switch (skdev->drive_state) {
2349 case FIT_SR_DRIVE_INIT:
2350 if (skdev->state == SKD_DRVR_STATE_PROTOCOL_MISMATCH) {
2351 skd_disable_interrupts(skdev);
2352 break;
2353 }
2354 if (skdev->state == SKD_DRVR_STATE_RESTARTING) {
2355 skd_recover_requests(skdev);
2356 }
2357 if (skdev->state == SKD_DRVR_STATE_WAIT_BOOT) {
2358 skdev->timer_countdown =
2359 SKD_TIMER_SECONDS(SKD_STARTING_TO);
2360 skdev->state = SKD_DRVR_STATE_STARTING;
2361 skd_soft_reset(skdev);
2362 break;
2363 }
2364 mtd = FIT_MXD_CONS(FIT_MTD_FITFW_INIT, 0, 0);
2365 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE);
2366 skdev->last_mtd = mtd;
2367 break;
2368
2369 case FIT_SR_DRIVE_ONLINE:
2370 skdev->queue_depth_limit = skdev->soft_queue_depth_limit;
2371 if (skdev->queue_depth_limit > skdev->hard_queue_depth_limit) {
2372 skdev->queue_depth_limit =
2373 skdev->hard_queue_depth_limit;
2374 }
2375
2376 skdev->queue_depth_lowat = skdev->queue_depth_limit * 2 / 3 + 1;
2377 if (skdev->queue_depth_lowat < 1)
2378 skdev->queue_depth_lowat = 1;
2379 Dcmn_err(CE_NOTE,
2380 "%s queue depth limit=%d hard=%d soft=%d lowat=%d",
2381 DRV_NAME,
2382 skdev->queue_depth_limit,
2383 skdev->hard_queue_depth_limit,
2384 skdev->soft_queue_depth_limit,
2385 skdev->queue_depth_lowat);
2386
2387 skd_refresh_device_data(skdev);
2388 break;
2389 case FIT_SR_DRIVE_BUSY:
2390 skdev->state = SKD_DRVR_STATE_BUSY;
2391 skdev->timer_countdown = SKD_TIMER_MINUTES(20);
2392 (void) skd_quiesce_dev(skdev);
2393 break;
2394 case FIT_SR_DRIVE_BUSY_SANITIZE:
2395 skdev->state = SKD_DRVR_STATE_BUSY_SANITIZE;
2396 skd_start(skdev);
2397 break;
2398 case FIT_SR_DRIVE_BUSY_ERASE:
2399 skdev->state = SKD_DRVR_STATE_BUSY_ERASE;
2400 skdev->timer_countdown = SKD_TIMER_MINUTES(20);
2401 break;
2402 case FIT_SR_DRIVE_OFFLINE:
2403 skdev->state = SKD_DRVR_STATE_IDLE;
2404 break;
2405 case FIT_SR_DRIVE_SOFT_RESET:
2406 skdev->state = SKD_DRVR_STATE_RESTARTING;
2407
2408 switch (skdev->state) {
2409 case SKD_DRVR_STATE_STARTING:
2410 case SKD_DRVR_STATE_RESTARTING:
2411 break;
2412 default:
2413 skdev->state = SKD_DRVR_STATE_RESTARTING;
2414 break;
2415 }
2416 break;
2417 case FIT_SR_DRIVE_FW_BOOTING:
2418 Dcmn_err(CE_NOTE,
2419 "ISR FIT_SR_DRIVE_FW_BOOTING %s", skdev->name);
2420 skdev->state = SKD_DRVR_STATE_WAIT_BOOT;
2421 skdev->timer_countdown = SKD_TIMER_SECONDS(SKD_WAIT_BOOT_TO);
2422 break;
2423
2424 case FIT_SR_DRIVE_DEGRADED:
2425 case FIT_SR_PCIE_LINK_DOWN:
2426 case FIT_SR_DRIVE_NEED_FW_DOWNLOAD:
2427 break;
2428
2429 case FIT_SR_DRIVE_FAULT:
2430 skd_drive_fault(skdev);
2431 skd_recover_requests(skdev);
2432 skd_start(skdev);
2433 break;
2434
2435 case 0xFF:
2436 skd_drive_disappeared(skdev);
2437 skd_recover_requests(skdev);
2438 skd_start(skdev);
2439 break;
2440 default:
2441 /*
2442 * Uknown FW State. Wait for a state we recognize.
2443 */
2444 break;
2445 }
2446
2447 Dcmn_err(CE_NOTE, "Driver state %s(%d)=>%s(%d)",
2448 skd_skdev_state_to_str(prev_driver_state), prev_driver_state,
2449 skd_skdev_state_to_str(skdev->state), skdev->state);
2450 }
2451
2452 /*
2453 *
2454 * Name: skd_recover_requests, attempts to recover requests.
2455 *
2456 * Inputs: skdev - device state structure.
2457 *
2458 * Returns: Nothing.
2459 *
2460 */
2461 static void
skd_recover_requests(struct skd_device * skdev)2462 skd_recover_requests(struct skd_device *skdev)
2463 {
2464 int i;
2465
2466 ASSERT(INTR_LOCK_HELD(skdev));
2467
2468 for (i = 0; i < skdev->num_req_context; i++) {
2469 struct skd_request_context *skreq = &skdev->skreq_table[i];
2470
2471 if (skreq->state == SKD_REQ_STATE_BUSY) {
2472 skd_log_skreq(skdev, skreq, "requeue");
2473
2474 ASSERT(0 != (skreq->id & SKD_ID_INCR));
2475 ASSERT(skreq->pbuf != NULL);
2476 /* Release DMA resources for the request. */
2477 skd_blkdev_postop_sg_list(skdev, skreq);
2478
2479 skd_end_request(skdev, skreq, EAGAIN);
2480 skreq->pbuf = NULL;
2481 skreq->state = SKD_REQ_STATE_IDLE;
2482 skreq->id += SKD_ID_INCR;
2483 }
2484 if (i > 0) {
2485 skreq[-1].next = skreq;
2486 }
2487 skreq->next = NULL;
2488 }
2489
2490 WAITQ_LOCK(skdev);
2491 skdev->skreq_free_list = skdev->skreq_table;
2492 WAITQ_UNLOCK(skdev);
2493
2494 for (i = 0; i < skdev->num_fitmsg_context; i++) {
2495 struct skd_fitmsg_context *skmsg = &skdev->skmsg_table[i];
2496
2497 if (skmsg->state == SKD_MSG_STATE_BUSY) {
2498 skd_log_skmsg(skdev, skmsg, "salvaged");
2499 ASSERT((skmsg->id & SKD_ID_INCR) != 0);
2500 skmsg->state = SKD_MSG_STATE_IDLE;
2501 skmsg->id &= ~SKD_ID_INCR;
2502 }
2503 if (i > 0) {
2504 skmsg[-1].next = skmsg;
2505 }
2506 skmsg->next = NULL;
2507 }
2508 WAITQ_LOCK(skdev);
2509 skdev->skmsg_free_list = skdev->skmsg_table;
2510 WAITQ_UNLOCK(skdev);
2511
2512 for (i = 0; i < SKD_N_TIMEOUT_SLOT; i++) {
2513 skdev->timeout_slot[i] = 0;
2514 }
2515 skdev->queue_depth_busy = 0;
2516 }
2517
2518 /*
2519 *
2520 * Name: skd_isr_msg_from_dev, handles a message from the device.
2521 *
2522 * Inputs: skdev - device state structure.
2523 *
2524 * Returns: Nothing.
2525 *
2526 */
2527 static void
skd_isr_msg_from_dev(struct skd_device * skdev)2528 skd_isr_msg_from_dev(struct skd_device *skdev)
2529 {
2530 uint32_t mfd;
2531 uint32_t mtd;
2532
2533 Dcmn_err(CE_NOTE, "skd_isr_msg_from_dev:");
2534
2535 mfd = SKD_READL(skdev, FIT_MSG_FROM_DEVICE);
2536
2537 Dcmn_err(CE_NOTE, "mfd=0x%x last_mtd=0x%x\n", mfd, skdev->last_mtd);
2538
2539 /*
2540 * ignore any mtd that is an ack for something we didn't send
2541 */
2542 if (FIT_MXD_TYPE(mfd) != FIT_MXD_TYPE(skdev->last_mtd)) {
2543 return;
2544 }
2545
2546 switch (FIT_MXD_TYPE(mfd)) {
2547 case FIT_MTD_FITFW_INIT:
2548 skdev->proto_ver = FIT_PROTOCOL_MAJOR_VER(mfd);
2549
2550 if (skdev->proto_ver != FIT_PROTOCOL_VERSION_1) {
2551 cmn_err(CE_WARN, "!(%s): protocol mismatch\n",
2552 skdev->name);
2553 cmn_err(CE_WARN, "!(%s): got=%d support=%d\n",
2554 skdev->name, skdev->proto_ver,
2555 FIT_PROTOCOL_VERSION_1);
2556 cmn_err(CE_WARN, "!(%s): please upgrade driver\n",
2557 skdev->name);
2558 skdev->state = SKD_DRVR_STATE_PROTOCOL_MISMATCH;
2559 skd_soft_reset(skdev);
2560 break;
2561 }
2562 mtd = FIT_MXD_CONS(FIT_MTD_GET_CMDQ_DEPTH, 0, 0);
2563 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE);
2564 skdev->last_mtd = mtd;
2565 break;
2566
2567 case FIT_MTD_GET_CMDQ_DEPTH:
2568 skdev->hard_queue_depth_limit = FIT_MXD_DATA(mfd);
2569 mtd = FIT_MXD_CONS(FIT_MTD_SET_COMPQ_DEPTH, 0,
2570 SKD_N_COMPLETION_ENTRY);
2571 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE);
2572 skdev->last_mtd = mtd;
2573 break;
2574
2575 case FIT_MTD_SET_COMPQ_DEPTH:
2576 SKD_WRITEQ(skdev, skdev->cq_dma_address.cookies->dmac_laddress,
2577 FIT_MSG_TO_DEVICE_ARG);
2578 mtd = FIT_MXD_CONS(FIT_MTD_SET_COMPQ_ADDR, 0, 0);
2579 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE);
2580 skdev->last_mtd = mtd;
2581 break;
2582
2583 case FIT_MTD_SET_COMPQ_ADDR:
2584 skd_reset_skcomp(skdev);
2585 mtd = FIT_MXD_CONS(FIT_MTD_ARM_QUEUE, 0, 0);
2586 SKD_WRITEL(skdev, mtd, FIT_MSG_TO_DEVICE);
2587 skdev->last_mtd = mtd;
2588 break;
2589
2590 case FIT_MTD_ARM_QUEUE:
2591 skdev->last_mtd = 0;
2592 /*
2593 * State should be, or soon will be, FIT_SR_DRIVE_ONLINE.
2594 */
2595 break;
2596
2597 default:
2598 break;
2599 }
2600 }
2601
2602
2603 /*
2604 *
2605 * Name: skd_disable_interrupts, issues command to disable
2606 * device interrupts.
2607 *
2608 * Inputs: skdev - device state structure.
2609 *
2610 * Returns: Nothing.
2611 *
2612 */
2613 static void
skd_disable_interrupts(struct skd_device * skdev)2614 skd_disable_interrupts(struct skd_device *skdev)
2615 {
2616 uint32_t sense;
2617
2618 Dcmn_err(CE_NOTE, "skd_disable_interrupts:");
2619
2620 sense = SKD_READL(skdev, FIT_CONTROL);
2621 sense &= ~FIT_CR_ENABLE_INTERRUPTS;
2622 SKD_WRITEL(skdev, sense, FIT_CONTROL);
2623
2624 Dcmn_err(CE_NOTE, "sense 0x%x", sense);
2625
2626 /*
2627 * Note that the 1s is written. A 1-bit means
2628 * disable, a 0 means enable.
2629 */
2630 SKD_WRITEL(skdev, ~0, FIT_INT_MASK_HOST);
2631 }
2632
2633 /*
2634 *
2635 * Name: skd_enable_interrupts, issues command to enable
2636 * device interrupts.
2637 *
2638 * Inputs: skdev - device state structure.
2639 *
2640 * Returns: Nothing.
2641 *
2642 */
2643 static void
skd_enable_interrupts(struct skd_device * skdev)2644 skd_enable_interrupts(struct skd_device *skdev)
2645 {
2646 uint32_t val;
2647
2648 Dcmn_err(CE_NOTE, "skd_enable_interrupts:");
2649
2650 /* unmask interrupts first */
2651 val = FIT_ISH_FW_STATE_CHANGE +
2652 FIT_ISH_COMPLETION_POSTED +
2653 FIT_ISH_MSG_FROM_DEV;
2654
2655 /*
2656 * Note that the compliment of mask is written. A 1-bit means
2657 * disable, a 0 means enable.
2658 */
2659 SKD_WRITEL(skdev, ~val, FIT_INT_MASK_HOST);
2660
2661 Dcmn_err(CE_NOTE, "interrupt mask=0x%x", ~val);
2662
2663 val = SKD_READL(skdev, FIT_CONTROL);
2664 val |= FIT_CR_ENABLE_INTERRUPTS;
2665
2666 Dcmn_err(CE_NOTE, "control=0x%x", val);
2667
2668 SKD_WRITEL(skdev, val, FIT_CONTROL);
2669 }
2670
2671 /*
2672 *
2673 * Name: skd_soft_reset, issues a soft reset to the hardware.
2674 *
2675 * Inputs: skdev - device state structure.
2676 *
2677 * Returns: Nothing.
2678 *
2679 */
2680 static void
skd_soft_reset(struct skd_device * skdev)2681 skd_soft_reset(struct skd_device *skdev)
2682 {
2683 uint32_t val;
2684
2685 Dcmn_err(CE_NOTE, "skd_soft_reset:");
2686
2687 val = SKD_READL(skdev, FIT_CONTROL);
2688 val |= (FIT_CR_SOFT_RESET);
2689
2690 Dcmn_err(CE_NOTE, "soft_reset: control=0x%x", val);
2691
2692 SKD_WRITEL(skdev, val, FIT_CONTROL);
2693 }
2694
2695 /*
2696 *
2697 * Name: skd_start_device, gets the device going.
2698 *
2699 * Inputs: skdev - device state structure.
2700 *
2701 * Returns: Nothing.
2702 *
2703 */
2704 static void
skd_start_device(struct skd_device * skdev)2705 skd_start_device(struct skd_device *skdev)
2706 {
2707 uint32_t state;
2708 int delay_action = 0;
2709
2710 Dcmn_err(CE_NOTE, "skd_start_device:");
2711
2712 /* ack all ghost interrupts */
2713 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST);
2714
2715 state = SKD_READL(skdev, FIT_STATUS);
2716
2717 Dcmn_err(CE_NOTE, "initial status=0x%x", state);
2718
2719 state &= FIT_SR_DRIVE_STATE_MASK;
2720 skdev->drive_state = state;
2721 skdev->last_mtd = 0;
2722
2723 skdev->state = SKD_DRVR_STATE_STARTING;
2724 skdev->timer_countdown = SKD_TIMER_SECONDS(SKD_STARTING_TO);
2725
2726 skd_enable_interrupts(skdev);
2727
2728 switch (skdev->drive_state) {
2729 case FIT_SR_DRIVE_OFFLINE:
2730 Dcmn_err(CE_NOTE, "(%s): Drive offline...",
2731 skd_name(skdev));
2732 break;
2733
2734 case FIT_SR_DRIVE_FW_BOOTING:
2735 Dcmn_err(CE_NOTE, "FIT_SR_DRIVE_FW_BOOTING %s\n", skdev->name);
2736 skdev->state = SKD_DRVR_STATE_WAIT_BOOT;
2737 skdev->timer_countdown = SKD_TIMER_SECONDS(SKD_WAIT_BOOT_TO);
2738 break;
2739
2740 case FIT_SR_DRIVE_BUSY_SANITIZE:
2741 Dcmn_err(CE_NOTE, "(%s): Start: BUSY_SANITIZE\n",
2742 skd_name(skdev));
2743 skdev->state = SKD_DRVR_STATE_BUSY_SANITIZE;
2744 skdev->timer_countdown = SKD_TIMER_SECONDS(60);
2745 break;
2746
2747 case FIT_SR_DRIVE_BUSY_ERASE:
2748 Dcmn_err(CE_NOTE, "(%s): Start: BUSY_ERASE\n",
2749 skd_name(skdev));
2750 skdev->state = SKD_DRVR_STATE_BUSY_ERASE;
2751 skdev->timer_countdown = SKD_TIMER_SECONDS(60);
2752 break;
2753
2754 case FIT_SR_DRIVE_INIT:
2755 case FIT_SR_DRIVE_ONLINE:
2756 skd_soft_reset(skdev);
2757
2758 break;
2759
2760 case FIT_SR_DRIVE_BUSY:
2761 Dcmn_err(CE_NOTE, "(%s): Drive Busy...\n",
2762 skd_name(skdev));
2763 skdev->state = SKD_DRVR_STATE_BUSY;
2764 skdev->timer_countdown = SKD_TIMER_SECONDS(60);
2765 break;
2766
2767 case FIT_SR_DRIVE_SOFT_RESET:
2768 Dcmn_err(CE_NOTE, "(%s) drive soft reset in prog\n",
2769 skd_name(skdev));
2770 break;
2771
2772 case FIT_SR_DRIVE_FAULT:
2773 /*
2774 * Fault state is bad...soft reset won't do it...
2775 * Hard reset, maybe, but does it work on device?
2776 * For now, just fault so the system doesn't hang.
2777 */
2778 skd_drive_fault(skdev);
2779
2780 delay_action = 1;
2781 break;
2782
2783 case 0xFF:
2784 skd_drive_disappeared(skdev);
2785
2786 delay_action = 1;
2787 break;
2788
2789 default:
2790 Dcmn_err(CE_NOTE, "(%s) Start: unknown state %x\n",
2791 skd_name(skdev), skdev->drive_state);
2792 break;
2793 }
2794
2795 state = SKD_READL(skdev, FIT_CONTROL);
2796 Dcmn_err(CE_NOTE, "FIT Control Status=0x%x\n", state);
2797
2798 state = SKD_READL(skdev, FIT_INT_STATUS_HOST);
2799 Dcmn_err(CE_NOTE, "Intr Status=0x%x\n", state);
2800
2801 state = SKD_READL(skdev, FIT_INT_MASK_HOST);
2802 Dcmn_err(CE_NOTE, "Intr Mask=0x%x\n", state);
2803
2804 state = SKD_READL(skdev, FIT_MSG_FROM_DEVICE);
2805 Dcmn_err(CE_NOTE, "Msg from Dev=0x%x\n", state);
2806
2807 state = SKD_READL(skdev, FIT_HW_VERSION);
2808 Dcmn_err(CE_NOTE, "HW version=0x%x\n", state);
2809
2810 if (delay_action) {
2811 /* start the queue so we can respond with error to requests */
2812 Dcmn_err(CE_NOTE, "Starting %s queue\n", skdev->name);
2813 skd_start(skdev);
2814 skdev->gendisk_on = -1;
2815 cv_signal(&skdev->cv_waitq);
2816 }
2817 }
2818
2819 /*
2820 *
2821 * Name: skd_restart_device, restart the hardware.
2822 *
2823 * Inputs: skdev - device state structure.
2824 *
2825 * Returns: Nothing.
2826 *
2827 */
2828 static void
skd_restart_device(struct skd_device * skdev)2829 skd_restart_device(struct skd_device *skdev)
2830 {
2831 uint32_t state;
2832
2833 Dcmn_err(CE_NOTE, "skd_restart_device:");
2834
2835 /* ack all ghost interrupts */
2836 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST);
2837
2838 state = SKD_READL(skdev, FIT_STATUS);
2839
2840 Dcmn_err(CE_NOTE, "skd_restart_device: drive status=0x%x\n", state);
2841
2842 state &= FIT_SR_DRIVE_STATE_MASK;
2843 skdev->drive_state = state;
2844 skdev->last_mtd = 0;
2845
2846 skdev->state = SKD_DRVR_STATE_RESTARTING;
2847 skdev->timer_countdown = SKD_TIMER_MINUTES(4);
2848
2849 skd_soft_reset(skdev);
2850 }
2851
2852 /*
2853 *
2854 * Name: skd_stop_device, stops the device.
2855 *
2856 * Inputs: skdev - device state structure.
2857 *
2858 * Returns: Nothing.
2859 *
2860 */
2861 static void
skd_stop_device(struct skd_device * skdev)2862 skd_stop_device(struct skd_device *skdev)
2863 {
2864 clock_t cur_ticks, tmo;
2865 int secs;
2866 struct skd_special_context *skspcl = &skdev->internal_skspcl;
2867
2868 if (SKD_DRVR_STATE_ONLINE != skdev->state) {
2869 Dcmn_err(CE_NOTE, "(%s): skd_stop_device not online no sync\n",
2870 skdev->name);
2871 goto stop_out;
2872 }
2873
2874 if (SKD_REQ_STATE_IDLE != skspcl->req.state) {
2875 Dcmn_err(CE_NOTE, "(%s): skd_stop_device no special\n",
2876 skdev->name);
2877 goto stop_out;
2878 }
2879
2880 skdev->state = SKD_DRVR_STATE_SYNCING;
2881 skdev->sync_done = 0;
2882
2883 skd_send_internal_skspcl(skdev, skspcl, SYNCHRONIZE_CACHE);
2884
2885 secs = 10;
2886 mutex_enter(&skdev->skd_internalio_mutex);
2887 while (skdev->sync_done == 0) {
2888 cur_ticks = ddi_get_lbolt();
2889 tmo = cur_ticks + drv_usectohz(1000000 * secs);
2890 if (cv_timedwait(&skdev->cv_waitq,
2891 &skdev->skd_internalio_mutex, tmo) == -1) {
2892 /* Oops - timed out */
2893
2894 Dcmn_err(CE_NOTE, "stop_device - %d secs TMO", secs);
2895 }
2896 }
2897
2898 mutex_exit(&skdev->skd_internalio_mutex);
2899
2900 switch (skdev->sync_done) {
2901 case 0:
2902 Dcmn_err(CE_NOTE, "(%s): skd_stop_device no sync\n",
2903 skdev->name);
2904 break;
2905 case 1:
2906 Dcmn_err(CE_NOTE, "(%s): skd_stop_device sync done\n",
2907 skdev->name);
2908 break;
2909 default:
2910 Dcmn_err(CE_NOTE, "(%s): skd_stop_device sync error\n",
2911 skdev->name);
2912 }
2913
2914
2915 stop_out:
2916 skdev->state = SKD_DRVR_STATE_STOPPING;
2917
2918 skd_disable_interrupts(skdev);
2919
2920 /* ensure all ints on device are cleared */
2921 SKD_WRITEL(skdev, FIT_INT_DEF_MASK, FIT_INT_STATUS_HOST);
2922 /* soft reset the device to unload with a clean slate */
2923 SKD_WRITEL(skdev, FIT_CR_SOFT_RESET, FIT_CONTROL);
2924 }
2925
2926 /*
2927 * CONSTRUCT
2928 */
2929
2930 static int skd_cons_skcomp(struct skd_device *);
2931 static int skd_cons_skmsg(struct skd_device *);
2932 static int skd_cons_skreq(struct skd_device *);
2933 static int skd_cons_sksb(struct skd_device *);
2934 static struct fit_sg_descriptor *skd_cons_sg_list(struct skd_device *, uint32_t,
2935 dma_mem_t *);
2936
2937 /*
2938 *
2939 * Name: skd_construct, calls other routines to build device
2940 * interface structures.
2941 *
2942 * Inputs: skdev - device state structure.
2943 * instance - DDI instance number.
2944 *
2945 * Returns: Returns DDI_FAILURE on any failure otherwise returns
2946 * DDI_SUCCESS.
2947 *
2948 */
2949 /* ARGSUSED */ /* Upstream common source with other platforms. */
2950 static int
skd_construct(skd_device_t * skdev,int instance)2951 skd_construct(skd_device_t *skdev, int instance)
2952 {
2953 int rc = 0;
2954
2955 skdev->state = SKD_DRVR_STATE_LOAD;
2956 skdev->irq_type = skd_isr_type;
2957 skdev->soft_queue_depth_limit = skd_max_queue_depth;
2958 skdev->hard_queue_depth_limit = 10; /* until GET_CMDQ_DEPTH */
2959
2960 skdev->num_req_context = skd_max_queue_depth;
2961 skdev->num_fitmsg_context = skd_max_queue_depth;
2962
2963 skdev->queue_depth_limit = skdev->hard_queue_depth_limit;
2964 skdev->queue_depth_lowat = 1;
2965 skdev->proto_ver = 99; /* initialize to invalid value */
2966 skdev->sgs_per_request = skd_sgs_per_request;
2967 skdev->dbg_level = skd_dbg_level;
2968
2969 rc = skd_cons_skcomp(skdev);
2970 if (rc < 0) {
2971 goto err_out;
2972 }
2973
2974 rc = skd_cons_skmsg(skdev);
2975 if (rc < 0) {
2976 goto err_out;
2977 }
2978
2979 rc = skd_cons_skreq(skdev);
2980 if (rc < 0) {
2981 goto err_out;
2982 }
2983
2984 rc = skd_cons_sksb(skdev);
2985 if (rc < 0) {
2986 goto err_out;
2987 }
2988
2989 Dcmn_err(CE_NOTE, "CONSTRUCT VICTORY");
2990
2991 return (DDI_SUCCESS);
2992
2993 err_out:
2994 Dcmn_err(CE_NOTE, "construct failed\n");
2995 skd_destruct(skdev);
2996
2997 return (DDI_FAILURE);
2998 }
2999
3000 /*
3001 *
3002 * Name: skd_free_phys, frees DMA memory.
3003 *
3004 * Inputs: skdev - device state structure.
3005 * mem - DMA info.
3006 *
3007 * Returns: Nothing.
3008 *
3009 */
3010 static void
skd_free_phys(skd_device_t * skdev,dma_mem_t * mem)3011 skd_free_phys(skd_device_t *skdev, dma_mem_t *mem)
3012 {
3013 _NOTE(ARGUNUSED(skdev));
3014
3015 if (mem == NULL || mem->dma_handle == NULL)
3016 return;
3017
3018 (void) ddi_dma_unbind_handle(mem->dma_handle);
3019
3020 if (mem->acc_handle != NULL) {
3021 ddi_dma_mem_free(&mem->acc_handle);
3022 mem->acc_handle = NULL;
3023 }
3024
3025 mem->bp = NULL;
3026 ddi_dma_free_handle(&mem->dma_handle);
3027 mem->dma_handle = NULL;
3028 }
3029
3030 /*
3031 *
3032 * Name: skd_alloc_dma_mem, allocates DMA memory.
3033 *
3034 * Inputs: skdev - device state structure.
3035 * mem - DMA data structure.
3036 * sleep - indicates whether called routine can sleep.
3037 * atype - specified 32 or 64 bit allocation.
3038 *
3039 * Returns: Void pointer to mem->bp on success else NULL.
3040 * NOTE: There are some failure modes even if sleep is set
3041 * to KM_SLEEP, so callers MUST check the return code even
3042 * if KM_SLEEP is passed in.
3043 *
3044 */
3045 static void *
skd_alloc_dma_mem(skd_device_t * skdev,dma_mem_t * mem,uint8_t atype)3046 skd_alloc_dma_mem(skd_device_t *skdev, dma_mem_t *mem, uint8_t atype)
3047 {
3048 size_t rlen;
3049 uint_t cnt;
3050 ddi_dma_attr_t dma_attr = skd_64bit_io_dma_attr;
3051 ddi_device_acc_attr_t acc_attr = {
3052 DDI_DEVICE_ATTR_V0,
3053 DDI_STRUCTURE_LE_ACC,
3054 DDI_STRICTORDER_ACC
3055 };
3056
3057 if (atype == ATYPE_32BIT)
3058 dma_attr.dma_attr_addr_hi = SKD_DMA_HIGH_32BIT_ADDRESS;
3059
3060 dma_attr.dma_attr_sgllen = 1;
3061
3062 /*
3063 * Allocate DMA memory.
3064 */
3065 if (ddi_dma_alloc_handle(skdev->dip, &dma_attr, DDI_DMA_SLEEP, NULL,
3066 &mem->dma_handle) != DDI_SUCCESS) {
3067 cmn_err(CE_WARN, "!alloc_dma_mem-1, failed");
3068
3069 mem->dma_handle = NULL;
3070
3071 return (NULL);
3072 }
3073
3074 if (ddi_dma_mem_alloc(mem->dma_handle, mem->size, &acc_attr,
3075 DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, (caddr_t *)&mem->bp, &rlen,
3076 &mem->acc_handle) != DDI_SUCCESS) {
3077 cmn_err(CE_WARN, "!skd_alloc_dma_mem-2, failed");
3078 ddi_dma_free_handle(&mem->dma_handle);
3079 mem->dma_handle = NULL;
3080 mem->acc_handle = NULL;
3081 mem->bp = NULL;
3082
3083 return (NULL);
3084 }
3085 bzero(mem->bp, mem->size);
3086
3087 if (ddi_dma_addr_bind_handle(mem->dma_handle, NULL, mem->bp,
3088 mem->size, (DDI_DMA_CONSISTENT | DDI_DMA_RDWR), DDI_DMA_SLEEP, NULL,
3089 &mem->cookie, &cnt) != DDI_DMA_MAPPED) {
3090 cmn_err(CE_WARN, "!skd_alloc_dma_mem-3, failed");
3091 ddi_dma_mem_free(&mem->acc_handle);
3092 ddi_dma_free_handle(&mem->dma_handle);
3093
3094 return (NULL);
3095 }
3096
3097 if (cnt > 1) {
3098 (void) ddi_dma_unbind_handle(mem->dma_handle);
3099 cmn_err(CE_WARN, "!skd_alloc_dma_mem-4, failed, "
3100 "cookie_count %d > 1", cnt);
3101 skd_free_phys(skdev, mem);
3102
3103 return (NULL);
3104 }
3105 mem->cookies = &mem->cookie;
3106 mem->cookies->dmac_size = mem->size;
3107
3108 return (mem->bp);
3109 }
3110
3111 /*
3112 *
3113 * Name: skd_cons_skcomp, allocates space for the skcomp table.
3114 *
3115 * Inputs: skdev - device state structure.
3116 *
3117 * Returns: -ENOMEM if no memory otherwise NULL.
3118 *
3119 */
3120 static int
skd_cons_skcomp(struct skd_device * skdev)3121 skd_cons_skcomp(struct skd_device *skdev)
3122 {
3123 uint64_t *dma_alloc;
3124 struct fit_completion_entry_v1 *skcomp;
3125 int rc = 0;
3126 uint32_t nbytes;
3127 dma_mem_t *mem;
3128
3129 nbytes = sizeof (*skcomp) * SKD_N_COMPLETION_ENTRY;
3130 nbytes += sizeof (struct fit_comp_error_info) * SKD_N_COMPLETION_ENTRY;
3131
3132 Dcmn_err(CE_NOTE, "cons_skcomp: nbytes=%d,entries=%d", nbytes,
3133 SKD_N_COMPLETION_ENTRY);
3134
3135 mem = &skdev->cq_dma_address;
3136 mem->size = nbytes;
3137
3138 dma_alloc = skd_alloc_dma_mem(skdev, mem, ATYPE_64BIT);
3139 skcomp = (struct fit_completion_entry_v1 *)dma_alloc;
3140 if (skcomp == NULL) {
3141 rc = -ENOMEM;
3142 goto err_out;
3143 }
3144
3145 bzero(skcomp, nbytes);
3146
3147 Dcmn_err(CE_NOTE, "cons_skcomp: skcomp=%p nbytes=%d",
3148 (void *)skcomp, nbytes);
3149
3150 skdev->skcomp_table = skcomp;
3151 skdev->skerr_table = (struct fit_comp_error_info *)(dma_alloc +
3152 (SKD_N_COMPLETION_ENTRY * sizeof (*skcomp) / sizeof (uint64_t)));
3153
3154 err_out:
3155 return (rc);
3156 }
3157
3158 /*
3159 *
3160 * Name: skd_cons_skmsg, allocates space for the skmsg table.
3161 *
3162 * Inputs: skdev - device state structure.
3163 *
3164 * Returns: -ENOMEM if no memory otherwise NULL.
3165 *
3166 */
3167 static int
skd_cons_skmsg(struct skd_device * skdev)3168 skd_cons_skmsg(struct skd_device *skdev)
3169 {
3170 dma_mem_t *mem;
3171 int rc = 0;
3172 uint32_t i;
3173
3174 Dcmn_err(CE_NOTE, "skmsg_table kzalloc, struct %lu, count %u total %lu",
3175 (ulong_t)sizeof (struct skd_fitmsg_context),
3176 skdev->num_fitmsg_context,
3177 (ulong_t)(sizeof (struct skd_fitmsg_context) *
3178 skdev->num_fitmsg_context));
3179
3180 skdev->skmsg_table = (struct skd_fitmsg_context *)kmem_zalloc(
3181 sizeof (struct skd_fitmsg_context) * skdev->num_fitmsg_context,
3182 KM_SLEEP);
3183
3184 for (i = 0; i < skdev->num_fitmsg_context; i++) {
3185 struct skd_fitmsg_context *skmsg;
3186
3187 skmsg = &skdev->skmsg_table[i];
3188
3189 skmsg->id = i + SKD_ID_FIT_MSG;
3190
3191 skmsg->state = SKD_MSG_STATE_IDLE;
3192
3193 mem = &skmsg->mb_dma_address;
3194 mem->size = SKD_N_FITMSG_BYTES + 64;
3195
3196 skmsg->msg_buf = skd_alloc_dma_mem(skdev, mem, ATYPE_64BIT);
3197
3198 if (NULL == skmsg->msg_buf) {
3199 rc = -ENOMEM;
3200 i++;
3201 break;
3202 }
3203
3204 skmsg->offset = 0;
3205
3206 bzero(skmsg->msg_buf, SKD_N_FITMSG_BYTES);
3207
3208 skmsg->next = &skmsg[1];
3209 }
3210
3211 /* Free list is in order starting with the 0th entry. */
3212 skdev->skmsg_table[i - 1].next = NULL;
3213 skdev->skmsg_free_list = skdev->skmsg_table;
3214
3215 return (rc);
3216 }
3217
3218 /*
3219 *
3220 * Name: skd_cons_skreq, allocates space for the skreq table.
3221 *
3222 * Inputs: skdev - device state structure.
3223 *
3224 * Returns: -ENOMEM if no memory otherwise NULL.
3225 *
3226 */
3227 static int
skd_cons_skreq(struct skd_device * skdev)3228 skd_cons_skreq(struct skd_device *skdev)
3229 {
3230 int rc = 0;
3231 uint32_t i;
3232
3233 Dcmn_err(CE_NOTE,
3234 "skreq_table kmem_zalloc, struct %lu, count %u total %lu",
3235 (ulong_t)sizeof (struct skd_request_context),
3236 skdev->num_req_context,
3237 (ulong_t) (sizeof (struct skd_request_context) *
3238 skdev->num_req_context));
3239
3240 skdev->skreq_table = (struct skd_request_context *)kmem_zalloc(
3241 sizeof (struct skd_request_context) * skdev->num_req_context,
3242 KM_SLEEP);
3243
3244 for (i = 0; i < skdev->num_req_context; i++) {
3245 struct skd_request_context *skreq;
3246
3247 skreq = &skdev->skreq_table[i];
3248
3249 skreq->id = (uint16_t)(i + SKD_ID_RW_REQUEST);
3250 skreq->state = SKD_REQ_STATE_IDLE;
3251
3252 skreq->sksg_list = skd_cons_sg_list(skdev,
3253 skdev->sgs_per_request,
3254 &skreq->sksg_dma_address);
3255
3256 if (NULL == skreq->sksg_list) {
3257 rc = -ENOMEM;
3258 goto err_out;
3259 }
3260
3261 skreq->next = &skreq[1];
3262 }
3263
3264 /* Free list is in order starting with the 0th entry. */
3265 skdev->skreq_table[i - 1].next = NULL;
3266 skdev->skreq_free_list = skdev->skreq_table;
3267
3268 err_out:
3269 return (rc);
3270 }
3271
3272 /*
3273 *
3274 * Name: skd_cons_sksb, allocates space for the skspcl msg buf
3275 * and data buf.
3276 *
3277 * Inputs: skdev - device state structure.
3278 *
3279 * Returns: -ENOMEM if no memory otherwise NULL.
3280 *
3281 */
3282 static int
skd_cons_sksb(struct skd_device * skdev)3283 skd_cons_sksb(struct skd_device *skdev)
3284 {
3285 int rc = 0;
3286 struct skd_special_context *skspcl;
3287 dma_mem_t *mem;
3288 uint32_t nbytes;
3289
3290 skspcl = &skdev->internal_skspcl;
3291
3292 skspcl->req.id = 0 + SKD_ID_INTERNAL;
3293 skspcl->req.state = SKD_REQ_STATE_IDLE;
3294
3295 nbytes = SKD_N_INTERNAL_BYTES;
3296
3297 mem = &skspcl->db_dma_address;
3298 mem->size = nbytes;
3299
3300 /* data_buf's DMA pointer is skspcl->db_dma_address */
3301 skspcl->data_buf = skd_alloc_dma_mem(skdev, mem, ATYPE_64BIT);
3302 if (skspcl->data_buf == NULL) {
3303 rc = -ENOMEM;
3304 goto err_out;
3305 }
3306
3307 bzero(skspcl->data_buf, nbytes);
3308
3309 nbytes = SKD_N_SPECIAL_FITMSG_BYTES;
3310
3311 mem = &skspcl->mb_dma_address;
3312 mem->size = nbytes;
3313
3314 /* msg_buf DMA pointer is skspcl->mb_dma_address */
3315 skspcl->msg_buf = skd_alloc_dma_mem(skdev, mem, ATYPE_64BIT);
3316 if (skspcl->msg_buf == NULL) {
3317 rc = -ENOMEM;
3318 goto err_out;
3319 }
3320
3321
3322 bzero(skspcl->msg_buf, nbytes);
3323
3324 skspcl->req.sksg_list = skd_cons_sg_list(skdev, 1,
3325 &skspcl->req.sksg_dma_address);
3326
3327
3328 if (skspcl->req.sksg_list == NULL) {
3329 rc = -ENOMEM;
3330 goto err_out;
3331 }
3332
3333 if (skd_format_internal_skspcl(skdev) == 0) {
3334 rc = -EINVAL;
3335 goto err_out;
3336 }
3337
3338 err_out:
3339 return (rc);
3340 }
3341
3342 /*
3343 *
3344 * Name: skd_cons_sg_list, allocates the S/G list.
3345 *
3346 * Inputs: skdev - device state structure.
3347 * n_sg - Number of scatter-gather entries.
3348 * ret_dma_addr - S/G list DMA pointer.
3349 *
3350 * Returns: A list of FIT message descriptors.
3351 *
3352 */
3353 static struct fit_sg_descriptor
skd_cons_sg_list(struct skd_device * skdev,uint32_t n_sg,dma_mem_t * ret_dma_addr)3354 *skd_cons_sg_list(struct skd_device *skdev,
3355 uint32_t n_sg, dma_mem_t *ret_dma_addr)
3356 {
3357 struct fit_sg_descriptor *sg_list;
3358 uint32_t nbytes;
3359 dma_mem_t *mem;
3360
3361 nbytes = sizeof (*sg_list) * n_sg;
3362
3363 mem = ret_dma_addr;
3364 mem->size = nbytes;
3365
3366 /* sg_list's DMA pointer is *ret_dma_addr */
3367 sg_list = skd_alloc_dma_mem(skdev, mem, ATYPE_32BIT);
3368
3369 if (sg_list != NULL) {
3370 uint64_t dma_address = ret_dma_addr->cookie.dmac_laddress;
3371 uint32_t i;
3372
3373 bzero(sg_list, nbytes);
3374
3375 for (i = 0; i < n_sg - 1; i++) {
3376 uint64_t ndp_off;
3377 ndp_off = (i + 1) * sizeof (struct fit_sg_descriptor);
3378
3379 sg_list[i].next_desc_ptr = dma_address + ndp_off;
3380 }
3381 sg_list[i].next_desc_ptr = 0LL;
3382 }
3383
3384 return (sg_list);
3385 }
3386
3387 /*
3388 * DESTRUCT (FREE)
3389 */
3390
3391 static void skd_free_skcomp(struct skd_device *skdev);
3392 static void skd_free_skmsg(struct skd_device *skdev);
3393 static void skd_free_skreq(struct skd_device *skdev);
3394 static void skd_free_sksb(struct skd_device *skdev);
3395
3396 static void skd_free_sg_list(struct skd_device *skdev,
3397 struct fit_sg_descriptor *sg_list,
3398 uint32_t n_sg, dma_mem_t dma_addr);
3399
3400 /*
3401 *
3402 * Name: skd_destruct, call various rouines to deallocate
3403 * space acquired during initialization.
3404 *
3405 * Inputs: skdev - device state structure.
3406 *
3407 * Returns: Nothing.
3408 *
3409 */
3410 static void
skd_destruct(struct skd_device * skdev)3411 skd_destruct(struct skd_device *skdev)
3412 {
3413 if (skdev == NULL) {
3414 return;
3415 }
3416
3417 Dcmn_err(CE_NOTE, "destruct sksb");
3418 skd_free_sksb(skdev);
3419
3420 Dcmn_err(CE_NOTE, "destruct skreq");
3421 skd_free_skreq(skdev);
3422
3423 Dcmn_err(CE_NOTE, "destruct skmsg");
3424 skd_free_skmsg(skdev);
3425
3426 Dcmn_err(CE_NOTE, "destruct skcomp");
3427 skd_free_skcomp(skdev);
3428
3429 Dcmn_err(CE_NOTE, "DESTRUCT VICTORY");
3430 }
3431
3432 /*
3433 *
3434 * Name: skd_free_skcomp, deallocates skcomp table DMA resources.
3435 *
3436 * Inputs: skdev - device state structure.
3437 *
3438 * Returns: Nothing.
3439 *
3440 */
3441 static void
skd_free_skcomp(struct skd_device * skdev)3442 skd_free_skcomp(struct skd_device *skdev)
3443 {
3444 if (skdev->skcomp_table != NULL) {
3445 skd_free_phys(skdev, &skdev->cq_dma_address);
3446 }
3447
3448 skdev->skcomp_table = NULL;
3449 }
3450
3451 /*
3452 *
3453 * Name: skd_free_skmsg, deallocates skmsg table DMA resources.
3454 *
3455 * Inputs: skdev - device state structure.
3456 *
3457 * Returns: Nothing.
3458 *
3459 */
3460 static void
skd_free_skmsg(struct skd_device * skdev)3461 skd_free_skmsg(struct skd_device *skdev)
3462 {
3463 uint32_t i;
3464
3465 if (NULL == skdev->skmsg_table)
3466 return;
3467
3468 for (i = 0; i < skdev->num_fitmsg_context; i++) {
3469 struct skd_fitmsg_context *skmsg;
3470
3471 skmsg = &skdev->skmsg_table[i];
3472
3473 if (skmsg->msg_buf != NULL) {
3474 skd_free_phys(skdev, &skmsg->mb_dma_address);
3475 }
3476
3477
3478 skmsg->msg_buf = NULL;
3479 }
3480
3481 kmem_free(skdev->skmsg_table, sizeof (struct skd_fitmsg_context) *
3482 skdev->num_fitmsg_context);
3483
3484 skdev->skmsg_table = NULL;
3485
3486 }
3487
3488 /*
3489 *
3490 * Name: skd_free_skreq, deallocates skspcl table DMA resources.
3491 *
3492 * Inputs: skdev - device state structure.
3493 *
3494 * Returns: Nothing.
3495 *
3496 */
3497 static void
skd_free_skreq(struct skd_device * skdev)3498 skd_free_skreq(struct skd_device *skdev)
3499 {
3500 uint32_t i;
3501
3502 if (NULL == skdev->skreq_table)
3503 return;
3504
3505 for (i = 0; i < skdev->num_req_context; i++) {
3506 struct skd_request_context *skreq;
3507
3508 skreq = &skdev->skreq_table[i];
3509
3510 skd_free_sg_list(skdev, skreq->sksg_list,
3511 skdev->sgs_per_request, skreq->sksg_dma_address);
3512
3513 skreq->sksg_list = NULL;
3514 }
3515
3516 kmem_free(skdev->skreq_table, sizeof (struct skd_request_context) *
3517 skdev->num_req_context);
3518
3519 skdev->skreq_table = NULL;
3520
3521 }
3522
3523 /*
3524 *
3525 * Name: skd_free_sksb, deallocates skspcl data buf and
3526 * msg buf DMA resources.
3527 *
3528 * Inputs: skdev - device state structure.
3529 *
3530 * Returns: Nothing.
3531 *
3532 */
3533 static void
skd_free_sksb(struct skd_device * skdev)3534 skd_free_sksb(struct skd_device *skdev)
3535 {
3536 struct skd_special_context *skspcl;
3537
3538 skspcl = &skdev->internal_skspcl;
3539
3540 if (skspcl->data_buf != NULL) {
3541 skd_free_phys(skdev, &skspcl->db_dma_address);
3542 }
3543
3544 skspcl->data_buf = NULL;
3545
3546 if (skspcl->msg_buf != NULL) {
3547 skd_free_phys(skdev, &skspcl->mb_dma_address);
3548 }
3549
3550 skspcl->msg_buf = NULL;
3551
3552 skd_free_sg_list(skdev, skspcl->req.sksg_list, 1,
3553 skspcl->req.sksg_dma_address);
3554
3555 skspcl->req.sksg_list = NULL;
3556 }
3557
3558 /*
3559 *
3560 * Name: skd_free_sg_list, deallocates S/G DMA resources.
3561 *
3562 * Inputs: skdev - device state structure.
3563 * sg_list - S/G list itself.
3564 * n_sg - nukmber of segments
3565 * dma_addr - S/G list DMA address.
3566 *
3567 * Returns: Nothing.
3568 *
3569 */
3570 /* ARGSUSED */ /* Upstream common source with other platforms. */
3571 static void
skd_free_sg_list(struct skd_device * skdev,struct fit_sg_descriptor * sg_list,uint32_t n_sg,dma_mem_t dma_addr)3572 skd_free_sg_list(struct skd_device *skdev,
3573 struct fit_sg_descriptor *sg_list,
3574 uint32_t n_sg, dma_mem_t dma_addr)
3575 {
3576 if (sg_list != NULL) {
3577 skd_free_phys(skdev, &dma_addr);
3578 }
3579 }
3580
3581 /*
3582 *
3583 * Name: skd_queue, queues the I/O request.
3584 *
3585 * Inputs: skdev - device state structure.
3586 * pbuf - I/O request
3587 *
3588 * Returns: Nothing.
3589 *
3590 */
3591 static void
skd_queue(skd_device_t * skdev,skd_buf_private_t * pbuf)3592 skd_queue(skd_device_t *skdev, skd_buf_private_t *pbuf)
3593 {
3594 struct waitqueue *waitq;
3595
3596 ASSERT(skdev != NULL);
3597 ASSERT(pbuf != NULL);
3598
3599 ASSERT(WAITQ_LOCK_HELD(skdev));
3600
3601 waitq = &skdev->waitqueue;
3602
3603 if (SIMPLEQ_EMPTY(waitq))
3604 SIMPLEQ_INSERT_HEAD(waitq, pbuf, sq);
3605 else
3606 SIMPLEQ_INSERT_TAIL(waitq, pbuf, sq);
3607 }
3608
3609 /*
3610 *
3611 * Name: skd_list_skreq, displays the skreq table entries.
3612 *
3613 * Inputs: skdev - device state structure.
3614 * list - flag, if true displays the entry address.
3615 *
3616 * Returns: Returns number of skmsg entries found.
3617 *
3618 */
3619 /* ARGSUSED */ /* Upstream common source with other platforms. */
3620 static int
skd_list_skreq(skd_device_t * skdev,int list)3621 skd_list_skreq(skd_device_t *skdev, int list)
3622 {
3623 int inx = 0;
3624 struct skd_request_context *skreq;
3625
3626 if (list) {
3627 Dcmn_err(CE_NOTE, "skreq_table[0]\n");
3628
3629 skreq = &skdev->skreq_table[0];
3630 while (skreq) {
3631 if (list)
3632 Dcmn_err(CE_NOTE,
3633 "%d: skreq=%p state=%d id=%x fid=%x "
3634 "pbuf=%p dir=%d comp=%d\n",
3635 inx, (void *)skreq, skreq->state,
3636 skreq->id, skreq->fitmsg_id,
3637 (void *)skreq->pbuf,
3638 skreq->sg_data_dir, skreq->did_complete);
3639 inx++;
3640 skreq = skreq->next;
3641 }
3642 }
3643
3644 inx = 0;
3645 skreq = skdev->skreq_free_list;
3646
3647 if (list)
3648 Dcmn_err(CE_NOTE, "skreq_free_list\n");
3649 while (skreq) {
3650 if (list)
3651 Dcmn_err(CE_NOTE, "%d: skreq=%p state=%d id=%x fid=%x "
3652 "pbuf=%p dir=%d\n", inx, (void *)skreq,
3653 skreq->state, skreq->id, skreq->fitmsg_id,
3654 (void *)skreq->pbuf, skreq->sg_data_dir);
3655 inx++;
3656 skreq = skreq->next;
3657 }
3658
3659 return (inx);
3660 }
3661
3662 /*
3663 *
3664 * Name: skd_list_skmsg, displays the skmsg table entries.
3665 *
3666 * Inputs: skdev - device state structure.
3667 * list - flag, if true displays the entry address.
3668 *
3669 * Returns: Returns number of skmsg entries found.
3670 *
3671 */
3672 static int
skd_list_skmsg(skd_device_t * skdev,int list)3673 skd_list_skmsg(skd_device_t *skdev, int list)
3674 {
3675 int inx = 0;
3676 struct skd_fitmsg_context *skmsgp;
3677
3678 skmsgp = &skdev->skmsg_table[0];
3679
3680 if (list) {
3681 Dcmn_err(CE_NOTE, "skmsg_table[0]\n");
3682
3683 while (skmsgp) {
3684 if (list)
3685 Dcmn_err(CE_NOTE, "%d: skmsgp=%p id=%x outs=%d "
3686 "l=%d o=%d nxt=%p\n", inx, (void *)skmsgp,
3687 skmsgp->id, skmsgp->outstanding,
3688 skmsgp->length, skmsgp->offset,
3689 (void *)skmsgp->next);
3690 inx++;
3691 skmsgp = skmsgp->next;
3692 }
3693 }
3694
3695 inx = 0;
3696 if (list)
3697 Dcmn_err(CE_NOTE, "skmsg_free_list\n");
3698 skmsgp = skdev->skmsg_free_list;
3699 while (skmsgp) {
3700 if (list)
3701 Dcmn_err(CE_NOTE, "%d: skmsgp=%p id=%x outs=%d l=%d "
3702 "o=%d nxt=%p\n",
3703 inx, (void *)skmsgp, skmsgp->id,
3704 skmsgp->outstanding, skmsgp->length,
3705 skmsgp->offset, (void *)skmsgp->next);
3706 inx++;
3707 skmsgp = skmsgp->next;
3708 }
3709
3710 return (inx);
3711 }
3712
3713 /*
3714 *
3715 * Name: skd_get_queue_pbuf, retrieves top of queue entry and
3716 * delinks entry from the queue.
3717 *
3718 * Inputs: skdev - device state structure.
3719 * drive - device number
3720 *
3721 * Returns: Returns the top of the job queue entry.
3722 *
3723 */
3724 static skd_buf_private_t
skd_get_queued_pbuf(skd_device_t * skdev)3725 *skd_get_queued_pbuf(skd_device_t *skdev)
3726 {
3727 skd_buf_private_t *pbuf;
3728
3729 ASSERT(WAITQ_LOCK_HELD(skdev));
3730 pbuf = SIMPLEQ_FIRST(&skdev->waitqueue);
3731 if (pbuf != NULL)
3732 SIMPLEQ_REMOVE_HEAD(&skdev->waitqueue, sq);
3733 return (pbuf);
3734 }
3735
3736 /*
3737 * PCI DRIVER GLUE
3738 */
3739
3740 /*
3741 *
3742 * Name: skd_pci_info, logs certain device PCI info.
3743 *
3744 * Inputs: skdev - device state structure.
3745 *
3746 * Returns: str which contains the device speed info..
3747 *
3748 */
3749 static char *
skd_pci_info(struct skd_device * skdev,char * str,size_t len)3750 skd_pci_info(struct skd_device *skdev, char *str, size_t len)
3751 {
3752 int pcie_reg;
3753
3754 str[0] = '\0';
3755
3756 pcie_reg = skd_pci_find_capability(skdev, PCI_CAP_ID_EXP);
3757
3758 if (pcie_reg) {
3759 uint16_t lstat, lspeed, lwidth;
3760
3761 pcie_reg += 0x12;
3762 lstat = pci_config_get16(skdev->pci_handle, pcie_reg);
3763 lspeed = lstat & (0xF);
3764 lwidth = (lstat & 0x3F0) >> 4;
3765
3766 (void) snprintf(str, len, "PCIe (%s rev %d)",
3767 lspeed == 1 ? "2.5GT/s" :
3768 lspeed == 2 ? "5.0GT/s" : "<unknown>",
3769 lwidth);
3770 }
3771
3772 return (str);
3773 }
3774
3775 /*
3776 * MODULE GLUE
3777 */
3778
3779 /*
3780 *
3781 * Name: skd_init, initializes certain values.
3782 *
3783 * Inputs: skdev - device state structure.
3784 *
3785 * Returns: Zero.
3786 *
3787 */
3788 /* ARGSUSED */ /* Upstream common source with other platforms. */
3789 static int
skd_init(skd_device_t * skdev)3790 skd_init(skd_device_t *skdev)
3791 {
3792 Dcmn_err(CE_NOTE, "skd_init: v%s-b%s\n", DRV_VERSION, DRV_BUILD_ID);
3793
3794 if (skd_max_queue_depth < 1 ||
3795 skd_max_queue_depth > SKD_MAX_QUEUE_DEPTH) {
3796 cmn_err(CE_NOTE, "skd_max_q_depth %d invalid, re-set to %d\n",
3797 skd_max_queue_depth, SKD_MAX_QUEUE_DEPTH_DEFAULT);
3798 skd_max_queue_depth = SKD_MAX_QUEUE_DEPTH_DEFAULT;
3799 }
3800
3801 if (skd_max_req_per_msg < 1 || skd_max_req_per_msg > 14) {
3802 cmn_err(CE_NOTE, "skd_max_req_per_msg %d invalid, set to %d\n",
3803 skd_max_req_per_msg, SKD_MAX_REQ_PER_MSG_DEFAULT);
3804 skd_max_req_per_msg = SKD_MAX_REQ_PER_MSG_DEFAULT;
3805 }
3806
3807
3808 if (skd_sgs_per_request < 1 || skd_sgs_per_request > 4096) {
3809 cmn_err(CE_NOTE, "skd_sg_per_request %d invalid, set to %d\n",
3810 skd_sgs_per_request, SKD_N_SG_PER_REQ_DEFAULT);
3811 skd_sgs_per_request = SKD_N_SG_PER_REQ_DEFAULT;
3812 }
3813
3814 if (skd_dbg_level < 0 || skd_dbg_level > 2) {
3815 cmn_err(CE_NOTE, "skd_dbg_level %d invalid, re-set to %d\n",
3816 skd_dbg_level, 0);
3817 skd_dbg_level = 0;
3818 }
3819
3820 return (0);
3821 }
3822
3823 /*
3824 *
3825 * Name: skd_exit, exits the driver & logs the fact.
3826 *
3827 * Inputs: none.
3828 *
3829 * Returns: Nothing.
3830 *
3831 */
3832 static void
skd_exit(void)3833 skd_exit(void)
3834 {
3835 cmn_err(CE_NOTE, "skd v%s unloading", DRV_VERSION);
3836 }
3837
3838 /*
3839 *
3840 * Name: skd_drive_state_to_str, converts binary drive state
3841 * to its corresponding string value.
3842 *
3843 * Inputs: Drive state.
3844 *
3845 * Returns: String representing drive state.
3846 *
3847 */
3848 const char *
skd_drive_state_to_str(int state)3849 skd_drive_state_to_str(int state)
3850 {
3851 switch (state) {
3852 case FIT_SR_DRIVE_OFFLINE: return ("OFFLINE");
3853 case FIT_SR_DRIVE_INIT: return ("INIT");
3854 case FIT_SR_DRIVE_ONLINE: return ("ONLINE");
3855 case FIT_SR_DRIVE_BUSY: return ("BUSY");
3856 case FIT_SR_DRIVE_FAULT: return ("FAULT");
3857 case FIT_SR_DRIVE_DEGRADED: return ("DEGRADED");
3858 case FIT_SR_PCIE_LINK_DOWN: return ("LINK_DOWN");
3859 case FIT_SR_DRIVE_SOFT_RESET: return ("SOFT_RESET");
3860 case FIT_SR_DRIVE_NEED_FW_DOWNLOAD: return ("NEED_FW");
3861 case FIT_SR_DRIVE_INIT_FAULT: return ("INIT_FAULT");
3862 case FIT_SR_DRIVE_BUSY_SANITIZE:return ("BUSY_SANITIZE");
3863 case FIT_SR_DRIVE_BUSY_ERASE: return ("BUSY_ERASE");
3864 case FIT_SR_DRIVE_FW_BOOTING: return ("FW_BOOTING");
3865 default: return ("???");
3866 }
3867 }
3868
3869 /*
3870 *
3871 * Name: skd_skdev_state_to_str, converts binary driver state
3872 * to its corresponding string value.
3873 *
3874 * Inputs: Driver state.
3875 *
3876 * Returns: String representing driver state.
3877 *
3878 */
3879 static const char *
skd_skdev_state_to_str(enum skd_drvr_state state)3880 skd_skdev_state_to_str(enum skd_drvr_state state)
3881 {
3882 switch (state) {
3883 case SKD_DRVR_STATE_LOAD: return ("LOAD");
3884 case SKD_DRVR_STATE_IDLE: return ("IDLE");
3885 case SKD_DRVR_STATE_BUSY: return ("BUSY");
3886 case SKD_DRVR_STATE_STARTING: return ("STARTING");
3887 case SKD_DRVR_STATE_ONLINE: return ("ONLINE");
3888 case SKD_DRVR_STATE_PAUSING: return ("PAUSING");
3889 case SKD_DRVR_STATE_PAUSED: return ("PAUSED");
3890 case SKD_DRVR_STATE_DRAINING_TIMEOUT: return ("DRAINING_TIMEOUT");
3891 case SKD_DRVR_STATE_RESTARTING: return ("RESTARTING");
3892 case SKD_DRVR_STATE_RESUMING: return ("RESUMING");
3893 case SKD_DRVR_STATE_STOPPING: return ("STOPPING");
3894 case SKD_DRVR_STATE_SYNCING: return ("SYNCING");
3895 case SKD_DRVR_STATE_FAULT: return ("FAULT");
3896 case SKD_DRVR_STATE_DISAPPEARED: return ("DISAPPEARED");
3897 case SKD_DRVR_STATE_BUSY_ERASE: return ("BUSY_ERASE");
3898 case SKD_DRVR_STATE_BUSY_SANITIZE:return ("BUSY_SANITIZE");
3899 case SKD_DRVR_STATE_BUSY_IMMINENT: return ("BUSY_IMMINENT");
3900 case SKD_DRVR_STATE_WAIT_BOOT: return ("WAIT_BOOT");
3901
3902 default: return ("???");
3903 }
3904 }
3905
3906 /*
3907 *
3908 * Name: skd_skmsg_state_to_str, converts binary driver state
3909 * to its corresponding string value.
3910 *
3911 * Inputs: Msg state.
3912 *
3913 * Returns: String representing msg state.
3914 *
3915 */
3916 static const char *
skd_skmsg_state_to_str(enum skd_fit_msg_state state)3917 skd_skmsg_state_to_str(enum skd_fit_msg_state state)
3918 {
3919 switch (state) {
3920 case SKD_MSG_STATE_IDLE: return ("IDLE");
3921 case SKD_MSG_STATE_BUSY: return ("BUSY");
3922 default: return ("???");
3923 }
3924 }
3925
3926 /*
3927 *
3928 * Name: skd_skreq_state_to_str, converts binary req state
3929 * to its corresponding string value.
3930 *
3931 * Inputs: Req state.
3932 *
3933 * Returns: String representing req state.
3934 *
3935 */
3936 static const char *
skd_skreq_state_to_str(enum skd_req_state state)3937 skd_skreq_state_to_str(enum skd_req_state state)
3938 {
3939 switch (state) {
3940 case SKD_REQ_STATE_IDLE: return ("IDLE");
3941 case SKD_REQ_STATE_SETUP: return ("SETUP");
3942 case SKD_REQ_STATE_BUSY: return ("BUSY");
3943 case SKD_REQ_STATE_COMPLETED: return ("COMPLETED");
3944 case SKD_REQ_STATE_TIMEOUT: return ("TIMEOUT");
3945 case SKD_REQ_STATE_ABORTED: return ("ABORTED");
3946 default: return ("???");
3947 }
3948 }
3949
3950 /*
3951 *
3952 * Name: skd_log_skdev, logs device state & parameters.
3953 *
3954 * Inputs: skdev - device state structure.
3955 * event - event (string) to log.
3956 *
3957 * Returns: Nothing.
3958 *
3959 */
3960 static void
skd_log_skdev(struct skd_device * skdev,const char * event)3961 skd_log_skdev(struct skd_device *skdev, const char *event)
3962 {
3963 Dcmn_err(CE_NOTE, "log_skdev(%s) skdev=%p event='%s'",
3964 skdev->name, (void *)skdev, event);
3965 Dcmn_err(CE_NOTE, " drive_state=%s(%d) driver_state=%s(%d)",
3966 skd_drive_state_to_str(skdev->drive_state), skdev->drive_state,
3967 skd_skdev_state_to_str(skdev->state), skdev->state);
3968 Dcmn_err(CE_NOTE, " busy=%d limit=%d soft=%d hard=%d lowat=%d",
3969 skdev->queue_depth_busy, skdev->queue_depth_limit,
3970 skdev->soft_queue_depth_limit, skdev->hard_queue_depth_limit,
3971 skdev->queue_depth_lowat);
3972 Dcmn_err(CE_NOTE, " timestamp=0x%x cycle=%d cycle_ix=%d",
3973 skdev->timeout_stamp, skdev->skcomp_cycle, skdev->skcomp_ix);
3974 }
3975
3976 /*
3977 *
3978 * Name: skd_log_skmsg, logs the skmsg event.
3979 *
3980 * Inputs: skdev - device state structure.
3981 * skmsg - FIT message structure.
3982 * event - event string to log.
3983 *
3984 * Returns: Nothing.
3985 *
3986 */
3987 static void
skd_log_skmsg(struct skd_device * skdev,struct skd_fitmsg_context * skmsg,const char * event)3988 skd_log_skmsg(struct skd_device *skdev,
3989 struct skd_fitmsg_context *skmsg, const char *event)
3990 {
3991 Dcmn_err(CE_NOTE, "log_skmsg:(%s) skmsg=%p event='%s'",
3992 skdev->name, (void *)skmsg, event);
3993 Dcmn_err(CE_NOTE, " state=%s(%d) id=0x%04x length=%d",
3994 skd_skmsg_state_to_str(skmsg->state), skmsg->state,
3995 skmsg->id, skmsg->length);
3996 }
3997
3998 /*
3999 *
4000 * Name: skd_log_skreq, logs the skreq event.
4001 *
4002 * Inputs: skdev - device state structure.
4003 * skreq -skreq structure.
4004 * event - event string to log.
4005 *
4006 * Returns: Nothing.
4007 *
4008 */
4009 static void
skd_log_skreq(struct skd_device * skdev,struct skd_request_context * skreq,const char * event)4010 skd_log_skreq(struct skd_device *skdev,
4011 struct skd_request_context *skreq, const char *event)
4012 {
4013 skd_buf_private_t *pbuf;
4014
4015 Dcmn_err(CE_NOTE, "log_skreq: (%s) skreq=%p pbuf=%p event='%s'",
4016 skdev->name, (void *)skreq, (void *)skreq->pbuf, event);
4017
4018 Dcmn_err(CE_NOTE, " state=%s(%d) id=0x%04x fitmsg=0x%04x",
4019 skd_skreq_state_to_str(skreq->state), skreq->state,
4020 skreq->id, skreq->fitmsg_id);
4021 Dcmn_err(CE_NOTE, " timo=0x%x sg_dir=%d n_sg=%d",
4022 skreq->timeout_stamp, skreq->sg_data_dir, skreq->n_sg);
4023
4024 if ((pbuf = skreq->pbuf) != NULL) {
4025 uint32_t lba, count;
4026 lba = pbuf->x_xfer->x_blkno;
4027 count = pbuf->x_xfer->x_nblks;
4028 Dcmn_err(CE_NOTE, " pbuf=%p lba=%u(0x%x) count=%u(0x%x) ",
4029 (void *)pbuf, lba, lba, count, count);
4030 Dcmn_err(CE_NOTE, " dir=%s "
4031 " intrs=%" PRId64 " qdepth=%d",
4032 (pbuf->dir & B_READ) ? "Read" : "Write",
4033 skdev->intr_cntr, skdev->queue_depth_busy);
4034 } else {
4035 Dcmn_err(CE_NOTE, " req=NULL\n");
4036 }
4037 }
4038
4039 /*
4040 *
4041 * Name: skd_init_mutex, initializes all mutexes.
4042 *
4043 * Inputs: skdev - device state structure.
4044 *
4045 * Returns: DDI_FAILURE on failure otherwise DDI_SUCCESS.
4046 *
4047 */
4048 static int
skd_init_mutex(skd_device_t * skdev)4049 skd_init_mutex(skd_device_t *skdev)
4050 {
4051 void *intr;
4052
4053 Dcmn_err(CE_CONT, "(%s%d): init_mutex flags=%x", DRV_NAME,
4054 skdev->instance, skdev->flags);
4055
4056 intr = (void *)(uintptr_t)skdev->intr_pri;
4057
4058 if (skdev->flags & SKD_MUTEX_INITED)
4059 cmn_err(CE_NOTE, "init_mutex: Oh-Oh - already INITED");
4060
4061 /* mutexes to protect the adapter state structure. */
4062 mutex_init(&skdev->skd_lock_mutex, NULL, MUTEX_DRIVER,
4063 DDI_INTR_PRI(intr));
4064 mutex_init(&skdev->skd_intr_mutex, NULL, MUTEX_DRIVER,
4065 DDI_INTR_PRI(intr));
4066 mutex_init(&skdev->waitqueue_mutex, NULL, MUTEX_DRIVER,
4067 DDI_INTR_PRI(intr));
4068 mutex_init(&skdev->skd_internalio_mutex, NULL, MUTEX_DRIVER,
4069 DDI_INTR_PRI(intr));
4070
4071 cv_init(&skdev->cv_waitq, NULL, CV_DRIVER, NULL);
4072
4073 skdev->flags |= SKD_MUTEX_INITED;
4074 if (skdev->flags & SKD_MUTEX_DESTROYED)
4075 skdev->flags &= ~SKD_MUTEX_DESTROYED;
4076
4077 Dcmn_err(CE_CONT, "init_mutex (%s%d): done, flags=%x", DRV_NAME,
4078 skdev->instance, skdev->flags);
4079
4080 return (DDI_SUCCESS);
4081 }
4082
4083 /*
4084 *
4085 * Name: skd_destroy_mutex, destroys all mutexes.
4086 *
4087 * Inputs: skdev - device state structure.
4088 *
4089 * Returns: Nothing.
4090 *
4091 */
4092 static void
skd_destroy_mutex(skd_device_t * skdev)4093 skd_destroy_mutex(skd_device_t *skdev)
4094 {
4095 if ((skdev->flags & SKD_MUTEX_DESTROYED) == 0) {
4096 if (skdev->flags & SKD_MUTEX_INITED) {
4097 mutex_destroy(&skdev->waitqueue_mutex);
4098 mutex_destroy(&skdev->skd_intr_mutex);
4099 mutex_destroy(&skdev->skd_lock_mutex);
4100 mutex_destroy(&skdev->skd_internalio_mutex);
4101
4102 cv_destroy(&skdev->cv_waitq);
4103
4104 skdev->flags |= SKD_MUTEX_DESTROYED;
4105
4106 if (skdev->flags & SKD_MUTEX_INITED)
4107 skdev->flags &= ~SKD_MUTEX_INITED;
4108 }
4109 }
4110 }
4111
4112 /*
4113 *
4114 * Name: skd_setup_intr, setup the interrupt handling
4115 *
4116 * Inputs: skdev - device state structure.
4117 * intr_type - requested DDI interrupt type.
4118 *
4119 * Returns: DDI_FAILURE on failure otherwise DDI_SUCCESS.
4120 *
4121 */
4122 static int
skd_setup_intr(skd_device_t * skdev,int intr_type)4123 skd_setup_intr(skd_device_t *skdev, int intr_type)
4124 {
4125 int32_t count = 0;
4126 int32_t avail = 0;
4127 int32_t actual = 0;
4128 int32_t ret;
4129 uint32_t i;
4130
4131 Dcmn_err(CE_CONT, "(%s%d): setup_intr", DRV_NAME, skdev->instance);
4132
4133 /* Get number of interrupts the platform h/w supports */
4134 if (((ret = ddi_intr_get_nintrs(skdev->dip, intr_type, &count)) !=
4135 DDI_SUCCESS) || count == 0) {
4136 cmn_err(CE_WARN, "!intr_setup failed, nintrs ret=%xh, cnt=%xh",
4137 ret, count);
4138
4139 return (DDI_FAILURE);
4140 }
4141
4142 /* Get number of available system interrupts */
4143 if (((ret = ddi_intr_get_navail(skdev->dip, intr_type, &avail)) !=
4144 DDI_SUCCESS) || avail == 0) {
4145 cmn_err(CE_WARN, "!intr_setup failed, navail ret=%xh, "
4146 "avail=%xh", ret, avail);
4147
4148 return (DDI_FAILURE);
4149 }
4150
4151 if (intr_type == DDI_INTR_TYPE_MSIX && avail < SKD_MSIX_MAXAIF) {
4152 cmn_err(CE_WARN, "!intr_setup failed, min MSI-X h/w vectors "
4153 "req'd: %d, avail: %d",
4154 SKD_MSIX_MAXAIF, count);
4155
4156 return (DDI_FAILURE);
4157 }
4158
4159 /* Allocate space for interrupt handles */
4160 skdev->hsize = sizeof (ddi_intr_handle_t) * avail;
4161 skdev->htable = kmem_zalloc(skdev->hsize, KM_SLEEP);
4162
4163 /* Allocate the interrupts */
4164 if ((ret = ddi_intr_alloc(skdev->dip, skdev->htable, intr_type,
4165 0, count, &actual, 0)) != DDI_SUCCESS) {
4166 cmn_err(CE_WARN, "!intr_setup failed, intr_alloc ret=%xh, "
4167 "count = %xh, " "actual=%xh", ret, count, actual);
4168
4169 skd_release_intr(skdev);
4170
4171 return (DDI_FAILURE);
4172 }
4173
4174 skdev->intr_cnt = actual;
4175
4176 if (intr_type == DDI_INTR_TYPE_FIXED)
4177 (void) ddi_intr_set_pri(skdev->htable[0], 10);
4178
4179 /* Get interrupt priority */
4180 if ((ret = ddi_intr_get_pri(skdev->htable[0], &skdev->intr_pri)) !=
4181 DDI_SUCCESS) {
4182 cmn_err(CE_WARN, "!intr_setup failed, get_pri ret=%xh", ret);
4183 skd_release_intr(skdev);
4184
4185 return (ret);
4186 }
4187
4188 /* Add the interrupt handlers */
4189 for (i = 0; i < actual; i++) {
4190 if ((ret = ddi_intr_add_handler(skdev->htable[i],
4191 skd_isr_aif, (void *)skdev, (void *)((ulong_t)i))) !=
4192 DDI_SUCCESS) {
4193 cmn_err(CE_WARN, "!intr_setup failed, addh#=%xh, "
4194 "act=%xh, ret=%xh", i, actual, ret);
4195 skd_release_intr(skdev);
4196
4197 return (ret);
4198 }
4199 }
4200
4201 /* Setup mutexes */
4202 if ((ret = skd_init_mutex(skdev)) != DDI_SUCCESS) {
4203 cmn_err(CE_WARN, "!intr_setup failed, mutex init ret=%xh", ret);
4204 skd_release_intr(skdev);
4205
4206 return (ret);
4207 }
4208
4209 /* Get the capabilities */
4210 (void) ddi_intr_get_cap(skdev->htable[0], &skdev->intr_cap);
4211
4212 /* Enable interrupts */
4213 if (skdev->intr_cap & DDI_INTR_FLAG_BLOCK) {
4214 if ((ret = ddi_intr_block_enable(skdev->htable,
4215 skdev->intr_cnt)) != DDI_SUCCESS) {
4216 cmn_err(CE_WARN, "!failed, intr_setup block enable, "
4217 "ret=%xh", ret);
4218 skd_destroy_mutex(skdev);
4219 skd_release_intr(skdev);
4220
4221 return (ret);
4222 }
4223 } else {
4224 for (i = 0; i < skdev->intr_cnt; i++) {
4225 if ((ret = ddi_intr_enable(skdev->htable[i])) !=
4226 DDI_SUCCESS) {
4227 cmn_err(CE_WARN, "!intr_setup failed, "
4228 "intr enable, ret=%xh", ret);
4229 skd_destroy_mutex(skdev);
4230 skd_release_intr(skdev);
4231
4232 return (ret);
4233 }
4234 }
4235 }
4236
4237 if (intr_type == DDI_INTR_TYPE_FIXED)
4238 (void) ddi_intr_clr_mask(skdev->htable[0]);
4239
4240 skdev->irq_type = intr_type;
4241
4242 return (DDI_SUCCESS);
4243 }
4244
4245 /*
4246 *
4247 * Name: skd_disable_intr, disable interrupt handling.
4248 *
4249 * Inputs: skdev - device state structure.
4250 *
4251 * Returns: Nothing.
4252 *
4253 */
4254 static void
skd_disable_intr(skd_device_t * skdev)4255 skd_disable_intr(skd_device_t *skdev)
4256 {
4257 uint32_t i, rval;
4258
4259 if (skdev->intr_cap & DDI_INTR_FLAG_BLOCK) {
4260 /* Remove AIF block interrupts (MSI/MSI-X) */
4261 if ((rval = ddi_intr_block_disable(skdev->htable,
4262 skdev->intr_cnt)) != DDI_SUCCESS) {
4263 cmn_err(CE_WARN, "!failed intr block disable, rval=%x",
4264 rval);
4265 }
4266 } else {
4267 /* Remove AIF non-block interrupts (fixed). */
4268 for (i = 0; i < skdev->intr_cnt; i++) {
4269 if ((rval = ddi_intr_disable(skdev->htable[i])) !=
4270 DDI_SUCCESS) {
4271 cmn_err(CE_WARN, "!failed intr disable, "
4272 "intr#=%xh, " "rval=%xh", i, rval);
4273 }
4274 }
4275 }
4276 }
4277
4278 /*
4279 *
4280 * Name: skd_release_intr, disables interrupt handling.
4281 *
4282 * Inputs: skdev - device state structure.
4283 *
4284 * Returns: Nothing.
4285 *
4286 */
4287 static void
skd_release_intr(skd_device_t * skdev)4288 skd_release_intr(skd_device_t *skdev)
4289 {
4290 int32_t i;
4291 int rval;
4292
4293
4294 Dcmn_err(CE_CONT, "REL_INTR intr_cnt=%d", skdev->intr_cnt);
4295
4296 if (skdev->irq_type == 0) {
4297 Dcmn_err(CE_CONT, "release_intr: (%s%d): done",
4298 DRV_NAME, skdev->instance);
4299 return;
4300 }
4301
4302 if (skdev->htable != NULL && skdev->hsize > 0) {
4303 i = (int32_t)skdev->hsize / (int32_t)sizeof (ddi_intr_handle_t);
4304
4305 while (i-- > 0) {
4306 if (skdev->htable[i] == 0) {
4307 Dcmn_err(CE_NOTE, "htable[%x]=0h", i);
4308 continue;
4309 }
4310
4311 if ((rval = ddi_intr_disable(skdev->htable[i])) !=
4312 DDI_SUCCESS)
4313 Dcmn_err(CE_NOTE, "release_intr: intr_disable "
4314 "htable[%d], rval=%d", i, rval);
4315
4316 if (i < skdev->intr_cnt) {
4317 if ((rval = ddi_intr_remove_handler(
4318 skdev->htable[i])) != DDI_SUCCESS)
4319 cmn_err(CE_WARN, "!release_intr: "
4320 "intr_remove_handler FAILED, "
4321 "rval=%d", rval);
4322
4323 Dcmn_err(CE_NOTE, "release_intr: "
4324 "remove_handler htable[%d]", i);
4325 }
4326
4327 if ((rval = ddi_intr_free(skdev->htable[i])) !=
4328 DDI_SUCCESS)
4329 cmn_err(CE_WARN, "!release_intr: intr_free "
4330 "FAILED, rval=%d", rval);
4331 Dcmn_err(CE_NOTE, "release_intr: intr_free htable[%d]",
4332 i);
4333 }
4334
4335 kmem_free(skdev->htable, skdev->hsize);
4336 skdev->htable = NULL;
4337 }
4338
4339 skdev->hsize = 0;
4340 skdev->intr_cnt = 0;
4341 skdev->intr_pri = 0;
4342 skdev->intr_cap = 0;
4343 skdev->irq_type = 0;
4344 }
4345
4346 /*
4347 *
4348 * Name: skd_dealloc_resources, deallocate resources allocated
4349 * during attach.
4350 *
4351 * Inputs: dip - DDI device info pointer.
4352 * skdev - device state structure.
4353 * seq - bit flag representing allocated item.
4354 * instance - device instance.
4355 *
4356 * Returns: Nothing.
4357 *
4358 */
4359 /* ARGSUSED */ /* Upstream common source with other platforms. */
4360 static void
skd_dealloc_resources(dev_info_t * dip,skd_device_t * skdev,uint32_t seq,int instance)4361 skd_dealloc_resources(dev_info_t *dip, skd_device_t *skdev,
4362 uint32_t seq, int instance)
4363 {
4364
4365 if (skdev == NULL)
4366 return;
4367
4368 if (seq & SKD_CONSTRUCTED)
4369 skd_destruct(skdev);
4370
4371 if (seq & SKD_INTR_ADDED) {
4372 skd_disable_intr(skdev);
4373 skd_release_intr(skdev);
4374 }
4375
4376 if (seq & SKD_DEV_IOBASE_MAPPED)
4377 ddi_regs_map_free(&skdev->dev_handle);
4378
4379 if (seq & SKD_IOMAP_IOBASE_MAPPED)
4380 ddi_regs_map_free(&skdev->iomap_handle);
4381
4382 if (seq & SKD_REGS_MAPPED)
4383 ddi_regs_map_free(&skdev->iobase_handle);
4384
4385 if (seq & SKD_CONFIG_SPACE_SETUP)
4386 pci_config_teardown(&skdev->pci_handle);
4387
4388 if (seq & SKD_SOFT_STATE_ALLOCED) {
4389 if (skdev->pathname &&
4390 (skdev->flags & SKD_PATHNAME_ALLOCED)) {
4391 kmem_free(skdev->pathname,
4392 strlen(skdev->pathname)+1);
4393 }
4394 }
4395
4396 if (skdev->s1120_devid)
4397 ddi_devid_free(skdev->s1120_devid);
4398 }
4399
4400 /*
4401 *
4402 * Name: skd_setup_interrupt, sets up the appropriate interrupt type
4403 * msi, msix, or fixed.
4404 *
4405 * Inputs: skdev - device state structure.
4406 *
4407 * Returns: DDI_FAILURE on failure otherwise DDI_SUCCESS.
4408 *
4409 */
4410 static int
skd_setup_interrupts(skd_device_t * skdev)4411 skd_setup_interrupts(skd_device_t *skdev)
4412 {
4413 int32_t rval = DDI_FAILURE;
4414 int32_t i;
4415 int32_t itypes = 0;
4416
4417 /*
4418 * See what types of interrupts this adapter and platform support
4419 */
4420 if ((i = ddi_intr_get_supported_types(skdev->dip, &itypes)) !=
4421 DDI_SUCCESS) {
4422 cmn_err(CE_NOTE, "intr supported types failed, rval=%xh, ", i);
4423 return (DDI_FAILURE);
4424 }
4425
4426 Dcmn_err(CE_NOTE, "%s:supported interrupts types: %x",
4427 skdev->name, itypes);
4428
4429 itypes &= skdev->irq_type;
4430
4431 if (!skd_disable_msix && (itypes & DDI_INTR_TYPE_MSIX) &&
4432 (rval = skd_setup_intr(skdev, DDI_INTR_TYPE_MSIX)) == DDI_SUCCESS) {
4433 cmn_err(CE_NOTE, "!%s: successful MSI-X setup",
4434 skdev->name);
4435 } else if (!skd_disable_msi && (itypes & DDI_INTR_TYPE_MSI) &&
4436 (rval = skd_setup_intr(skdev, DDI_INTR_TYPE_MSI)) == DDI_SUCCESS) {
4437 cmn_err(CE_NOTE, "!%s: successful MSI setup",
4438 skdev->name);
4439 } else if ((itypes & DDI_INTR_TYPE_FIXED) &&
4440 (rval = skd_setup_intr(skdev, DDI_INTR_TYPE_FIXED))
4441 == DDI_SUCCESS) {
4442 cmn_err(CE_NOTE, "!%s: successful fixed intr setup",
4443 skdev->name);
4444 } else {
4445 cmn_err(CE_WARN, "!%s: no supported interrupt types",
4446 skdev->name);
4447 return (DDI_FAILURE);
4448 }
4449
4450 Dcmn_err(CE_CONT, "%s: setup interrupts done", skdev->name);
4451
4452 return (rval);
4453 }
4454
4455 /*
4456 *
4457 * Name: skd_get_properties, retrieves properties from skd.conf.
4458 *
4459 * Inputs: skdev - device state structure.
4460 * dip - dev_info data structure.
4461 *
4462 * Returns: Nothing.
4463 *
4464 */
4465 /* ARGSUSED */ /* Upstream common source with other platforms. */
4466 static void
skd_get_properties(dev_info_t * dip,skd_device_t * skdev)4467 skd_get_properties(dev_info_t *dip, skd_device_t *skdev)
4468 {
4469 int prop_value;
4470
4471 skd_isr_type = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0,
4472 "intr-type-cap", -1);
4473
4474 prop_value = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0,
4475 "max-scsi-reqs", -1);
4476 if (prop_value >= 1 && prop_value <= SKD_MAX_QUEUE_DEPTH)
4477 skd_max_queue_depth = prop_value;
4478
4479 prop_value = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0,
4480 "max-scsi-reqs-per-msg", -1);
4481 if (prop_value >= 1 && prop_value <= SKD_MAX_REQ_PER_MSG)
4482 skd_max_req_per_msg = prop_value;
4483
4484 prop_value = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0,
4485 "max-sgs-per-req", -1);
4486 if (prop_value >= 1 && prop_value <= SKD_MAX_N_SG_PER_REQ)
4487 skd_sgs_per_request = prop_value;
4488
4489 prop_value = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0,
4490 "dbg-level", -1);
4491 if (prop_value >= 1 && prop_value <= 2)
4492 skd_dbg_level = prop_value;
4493 }
4494
4495 /*
4496 *
4497 * Name: skd_wait_for_s1120, wait for device to finish
4498 * its initialization.
4499 *
4500 * Inputs: skdev - device state structure.
4501 *
4502 * Returns: DDI_SUCCESS or DDI_FAILURE.
4503 *
4504 */
4505 static int
skd_wait_for_s1120(skd_device_t * skdev)4506 skd_wait_for_s1120(skd_device_t *skdev)
4507 {
4508 clock_t cur_ticks, tmo;
4509 int loop_cntr = 0;
4510 int rc = DDI_FAILURE;
4511
4512 mutex_enter(&skdev->skd_internalio_mutex);
4513
4514 while (skdev->gendisk_on == 0) {
4515 cur_ticks = ddi_get_lbolt();
4516 tmo = cur_ticks + drv_usectohz(MICROSEC);
4517 if (cv_timedwait(&skdev->cv_waitq,
4518 &skdev->skd_internalio_mutex, tmo) == -1) {
4519 /* Oops - timed out */
4520 if (loop_cntr++ > 10)
4521 break;
4522 }
4523 }
4524
4525 mutex_exit(&skdev->skd_internalio_mutex);
4526
4527 if (skdev->gendisk_on == 1)
4528 rc = DDI_SUCCESS;
4529
4530 return (rc);
4531 }
4532
4533 /*
4534 *
4535 * Name: skd_update_props, updates certain device properties.
4536 *
4537 * Inputs: skdev - device state structure.
4538 * dip - dev info structure
4539 *
4540 * Returns: Nothing.
4541 *
4542 */
4543 static void
skd_update_props(skd_device_t * skdev,dev_info_t * dip)4544 skd_update_props(skd_device_t *skdev, dev_info_t *dip)
4545 {
4546 int blksize = 512;
4547
4548 if ((ddi_prop_update_int64(DDI_DEV_T_NONE, dip, "device-nblocks",
4549 skdev->Nblocks) != DDI_SUCCESS) ||
4550 (ddi_prop_update_int(DDI_DEV_T_NONE, dip, "device-blksize",
4551 blksize) != DDI_SUCCESS)) {
4552 cmn_err(CE_NOTE, "%s: FAILED to create driver properties",
4553 skdev->name);
4554 }
4555 }
4556
4557 /*
4558 *
4559 * Name: skd_setup_devid, sets up device ID info.
4560 *
4561 * Inputs: skdev - device state structure.
4562 * devid - Device ID for the DDI.
4563 *
4564 * Returns: DDI_SUCCESS or DDI_FAILURE.
4565 *
4566 */
4567 static int
skd_setup_devid(skd_device_t * skdev,ddi_devid_t * devid)4568 skd_setup_devid(skd_device_t *skdev, ddi_devid_t *devid)
4569 {
4570 int rc, sz_model, sz_sn, sz;
4571
4572 sz_model = scsi_ascii_inquiry_len(skdev->inq_product_id,
4573 strlen(skdev->inq_product_id));
4574 sz_sn = scsi_ascii_inquiry_len(skdev->inq_serial_num,
4575 strlen(skdev->inq_serial_num));
4576 sz = sz_model + sz_sn + 1;
4577
4578 (void) snprintf(skdev->devid_str, sizeof (skdev->devid_str),
4579 "%.*s=%.*s", sz_model, skdev->inq_product_id, sz_sn,
4580 skdev->inq_serial_num);
4581 rc = ddi_devid_init(skdev->dip, DEVID_SCSI_SERIAL, sz,
4582 skdev->devid_str, devid);
4583
4584 if (rc != DDI_SUCCESS)
4585 cmn_err(CE_WARN, "!%s: devid_init FAILED", skdev->name);
4586
4587 return (rc);
4588
4589 }
4590
4591 /*
4592 *
4593 * Name: skd_bd_attach, attach to blkdev driver
4594 *
4595 * Inputs: skdev - device state structure.
4596 * dip - device info structure.
4597 *
4598 * Returns: DDI_SUCCESS or DDI_FAILURE.
4599 *
4600 */
4601 static int
skd_bd_attach(dev_info_t * dip,skd_device_t * skdev)4602 skd_bd_attach(dev_info_t *dip, skd_device_t *skdev)
4603 {
4604 int rv;
4605
4606 skdev->s_bdh = bd_alloc_handle(skdev, &skd_bd_ops,
4607 &skd_64bit_io_dma_attr, KM_SLEEP);
4608
4609 if (skdev->s_bdh == NULL) {
4610 cmn_err(CE_WARN, "!skd_bd_attach: FAILED");
4611
4612 return (DDI_FAILURE);
4613 }
4614
4615 rv = bd_attach_handle(dip, skdev->s_bdh);
4616
4617 if (rv != DDI_SUCCESS) {
4618 cmn_err(CE_WARN, "!bd_attach_handle FAILED\n");
4619 } else {
4620 Dcmn_err(CE_NOTE, "bd_attach_handle OK\n");
4621 skdev->bd_attached++;
4622 }
4623
4624 return (rv);
4625 }
4626
4627 /*
4628 *
4629 * Name: skd_bd_detach, detach from the blkdev driver.
4630 *
4631 * Inputs: skdev - device state structure.
4632 *
4633 * Returns: Nothing.
4634 *
4635 */
4636 static void
skd_bd_detach(skd_device_t * skdev)4637 skd_bd_detach(skd_device_t *skdev)
4638 {
4639 if (skdev->bd_attached)
4640 (void) bd_detach_handle(skdev->s_bdh);
4641
4642 bd_free_handle(skdev->s_bdh);
4643 }
4644
4645 /*
4646 *
4647 * Name: skd_attach, attach sdk device driver
4648 *
4649 * Inputs: dip - device info structure.
4650 * cmd - DDI attach argument (ATTACH, RESUME, etc.)
4651 *
4652 * Returns: DDI_SUCCESS or DDI_FAILURE.
4653 *
4654 */
4655 static int
skd_attach(dev_info_t * dip,ddi_attach_cmd_t cmd)4656 skd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
4657 {
4658 int instance;
4659 int nregs;
4660 skd_device_t *skdev = NULL;
4661 int inx;
4662 uint16_t cmd_reg;
4663 int progress = 0;
4664 char name[MAXPATHLEN];
4665 off_t regsize;
4666 char pci_str[32];
4667 char fw_version[8];
4668
4669 instance = ddi_get_instance(dip);
4670
4671 (void) ddi_get_parent_data(dip);
4672
4673 switch (cmd) {
4674 case DDI_ATTACH:
4675 break;
4676
4677 case DDI_RESUME:
4678 /* Re-enable timer */
4679 skd_start_timer(skdev);
4680
4681 return (DDI_SUCCESS);
4682
4683 default:
4684 return (DDI_FAILURE);
4685 }
4686
4687 Dcmn_err(CE_NOTE, "sTec S1120 Driver v%s Instance: %d",
4688 VERSIONSTR, instance);
4689
4690 /*
4691 * Check that hardware is installed in a DMA-capable slot
4692 */
4693 if (ddi_slaveonly(dip) == DDI_SUCCESS) {
4694 cmn_err(CE_WARN, "!%s%d: installed in a "
4695 "slot that isn't DMA-capable slot", DRV_NAME, instance);
4696 return (DDI_FAILURE);
4697 }
4698
4699 /*
4700 * No support for high-level interrupts
4701 */
4702 if (ddi_intr_hilevel(dip, 0) != 0) {
4703 cmn_err(CE_WARN, "!%s%d: High level interrupt not supported",
4704 DRV_NAME, instance);
4705 return (DDI_FAILURE);
4706 }
4707
4708 /*
4709 * Allocate our per-device-instance structure
4710 */
4711 if (ddi_soft_state_zalloc(skd_state, instance) !=
4712 DDI_SUCCESS) {
4713 cmn_err(CE_WARN, "!%s%d: soft state zalloc failed ",
4714 DRV_NAME, instance);
4715 return (DDI_FAILURE);
4716 }
4717
4718 progress |= SKD_SOFT_STATE_ALLOCED;
4719
4720 skdev = ddi_get_soft_state(skd_state, instance);
4721 if (skdev == NULL) {
4722 cmn_err(CE_WARN, "!%s%d: Unable to get soft state structure",
4723 DRV_NAME, instance);
4724 goto skd_attach_failed;
4725 }
4726
4727 (void) snprintf(skdev->name, sizeof (skdev->name),
4728 DRV_NAME "%d", instance);
4729
4730 skdev->dip = dip;
4731 skdev->instance = instance;
4732
4733 ddi_set_driver_private(dip, skdev);
4734
4735 (void) ddi_pathname(dip, name);
4736 for (inx = strlen(name); inx; inx--) {
4737 if (name[inx] == ',') {
4738 name[inx] = '\0';
4739 break;
4740 }
4741 if (name[inx] == '@') {
4742 break;
4743 }
4744 }
4745
4746 skdev->pathname = kmem_zalloc(strlen(name) + 1, KM_SLEEP);
4747 (void) strlcpy(skdev->pathname, name, strlen(name) + 1);
4748
4749 progress |= SKD_PATHNAME_ALLOCED;
4750 skdev->flags |= SKD_PATHNAME_ALLOCED;
4751
4752 if (pci_config_setup(dip, &skdev->pci_handle) != DDI_SUCCESS) {
4753 cmn_err(CE_WARN, "!%s%d: pci_config_setup FAILED",
4754 DRV_NAME, instance);
4755 goto skd_attach_failed;
4756 }
4757
4758 progress |= SKD_CONFIG_SPACE_SETUP;
4759
4760 /* Save adapter path. */
4761
4762 (void) ddi_dev_nregs(dip, &nregs);
4763
4764 /*
4765 * 0x0 Configuration Space
4766 * 0x1 I/O Space
4767 * 0x2 s1120 register space
4768 */
4769 if (ddi_dev_regsize(dip, 1, ®size) != DDI_SUCCESS ||
4770 ddi_regs_map_setup(dip, 1, &skdev->iobase, 0, regsize,
4771 &dev_acc_attr, &skdev->iobase_handle) != DDI_SUCCESS) {
4772 cmn_err(CE_WARN, "!%s%d: regs_map_setup(mem) failed",
4773 DRV_NAME, instance);
4774 goto skd_attach_failed;
4775 }
4776 progress |= SKD_REGS_MAPPED;
4777
4778 skdev->iomap_iobase = skdev->iobase;
4779 skdev->iomap_handle = skdev->iobase_handle;
4780
4781 Dcmn_err(CE_NOTE, "%s: PCI iobase=%ph, iomap=%ph, regnum=%d, "
4782 "regsize=%ld", skdev->name, (void *)skdev->iobase,
4783 (void *)skdev->iomap_iobase, 1, regsize);
4784
4785 if (ddi_dev_regsize(dip, 2, ®size) != DDI_SUCCESS ||
4786 ddi_regs_map_setup(dip, 2, &skdev->dev_iobase, 0, regsize,
4787 &dev_acc_attr, &skdev->dev_handle) != DDI_SUCCESS) {
4788 cmn_err(CE_WARN, "!%s%d: regs_map_setup(mem) failed",
4789 DRV_NAME, instance);
4790
4791 goto skd_attach_failed;
4792 }
4793
4794 skdev->dev_memsize = (int)regsize;
4795
4796 Dcmn_err(CE_NOTE, "%s: DEV iobase=%ph regsize=%d",
4797 skdev->name, (void *)skdev->dev_iobase,
4798 skdev->dev_memsize);
4799
4800 progress |= SKD_DEV_IOBASE_MAPPED;
4801
4802 cmd_reg = pci_config_get16(skdev->pci_handle, PCI_CONF_COMM);
4803 cmd_reg |= (PCI_COMM_ME | PCI_COMM_INTX_DISABLE);
4804 cmd_reg &= ~PCI_COMM_PARITY_DETECT;
4805 pci_config_put16(skdev->pci_handle, PCI_CONF_COMM, cmd_reg);
4806
4807 /* Get adapter PCI device information. */
4808 skdev->vendor_id = pci_config_get16(skdev->pci_handle, PCI_CONF_VENID);
4809 skdev->device_id = pci_config_get16(skdev->pci_handle, PCI_CONF_DEVID);
4810
4811 Dcmn_err(CE_NOTE, "%s: %x-%x card detected",
4812 skdev->name, skdev->vendor_id, skdev->device_id);
4813
4814 skd_get_properties(dip, skdev);
4815
4816 (void) skd_init(skdev);
4817
4818 if (skd_construct(skdev, instance)) {
4819 cmn_err(CE_WARN, "!%s: construct FAILED", skdev->name);
4820 goto skd_attach_failed;
4821 }
4822
4823 progress |= SKD_PROBED;
4824 progress |= SKD_CONSTRUCTED;
4825
4826 SIMPLEQ_INIT(&skdev->waitqueue);
4827
4828 /*
4829 * Setup interrupt handler
4830 */
4831 if (skd_setup_interrupts(skdev) != DDI_SUCCESS) {
4832 cmn_err(CE_WARN, "!%s: Unable to add interrupt",
4833 skdev->name);
4834 goto skd_attach_failed;
4835 }
4836
4837 progress |= SKD_INTR_ADDED;
4838
4839 ADAPTER_STATE_LOCK(skdev);
4840 skdev->flags |= SKD_ATTACHED;
4841 ADAPTER_STATE_UNLOCK(skdev);
4842
4843 skdev->d_blkshift = 9;
4844 progress |= SKD_ATTACHED;
4845
4846
4847 skd_start_device(skdev);
4848
4849 ADAPTER_STATE_LOCK(skdev);
4850 skdev->progress = progress;
4851 ADAPTER_STATE_UNLOCK(skdev);
4852
4853 /*
4854 * Give the board a chance to
4855 * complete its initialization.
4856 */
4857 if (skdev->gendisk_on != 1)
4858 (void) skd_wait_for_s1120(skdev);
4859
4860 if (skdev->gendisk_on != 1) {
4861 cmn_err(CE_WARN, "!%s: s1120 failed to come ONLINE",
4862 skdev->name);
4863 goto skd_attach_failed;
4864 }
4865
4866 ddi_report_dev(dip);
4867
4868 skd_send_internal_skspcl(skdev, &skdev->internal_skspcl, INQUIRY);
4869
4870 skdev->disks_initialized++;
4871
4872 (void) strcpy(fw_version, "???");
4873 (void) skd_pci_info(skdev, pci_str, sizeof (pci_str));
4874 Dcmn_err(CE_NOTE, " sTec S1120 Driver(%s) version %s-b%s",
4875 DRV_NAME, DRV_VERSION, DRV_BUILD_ID);
4876
4877 Dcmn_err(CE_NOTE, " sTec S1120 %04x:%04x %s 64 bit",
4878 skdev->vendor_id, skdev->device_id, pci_str);
4879
4880 Dcmn_err(CE_NOTE, " sTec S1120 %s\n", skdev->pathname);
4881
4882 if (*skdev->inq_serial_num)
4883 Dcmn_err(CE_NOTE, " sTec S1120 serial#=%s",
4884 skdev->inq_serial_num);
4885
4886 if (*skdev->inq_product_id &&
4887 *skdev->inq_product_rev)
4888 Dcmn_err(CE_NOTE, " sTec S1120 prod ID=%s prod rev=%s",
4889 skdev->inq_product_id, skdev->inq_product_rev);
4890
4891 Dcmn_err(CE_NOTE, "%s: intr-type-cap: %d",
4892 skdev->name, skdev->irq_type);
4893 Dcmn_err(CE_NOTE, "%s: max-scsi-reqs: %d",
4894 skdev->name, skd_max_queue_depth);
4895 Dcmn_err(CE_NOTE, "%s: max-sgs-per-req: %d",
4896 skdev->name, skd_sgs_per_request);
4897 Dcmn_err(CE_NOTE, "%s: max-scsi-req-per-msg: %d",
4898 skdev->name, skd_max_req_per_msg);
4899
4900 if (skd_bd_attach(dip, skdev) == DDI_FAILURE)
4901 goto skd_attach_failed;
4902
4903 skd_update_props(skdev, dip);
4904
4905 /* Enable timer */
4906 skd_start_timer(skdev);
4907
4908 ADAPTER_STATE_LOCK(skdev);
4909 skdev->progress = progress;
4910 ADAPTER_STATE_UNLOCK(skdev);
4911
4912 skdev->attached = 1;
4913 return (DDI_SUCCESS);
4914
4915 skd_attach_failed:
4916 skd_dealloc_resources(dip, skdev, progress, instance);
4917
4918 if ((skdev->flags & SKD_MUTEX_DESTROYED) == 0) {
4919 skd_destroy_mutex(skdev);
4920 }
4921
4922 ddi_soft_state_free(skd_state, instance);
4923
4924 cmn_err(CE_WARN, "!skd_attach FAILED: progress=%x", progress);
4925 return (DDI_FAILURE);
4926 }
4927
4928 /*
4929 *
4930 * Name: skd_halt
4931 *
4932 * Inputs: skdev - device state structure.
4933 *
4934 * Returns: Nothing.
4935 *
4936 */
4937 static void
skd_halt(skd_device_t * skdev)4938 skd_halt(skd_device_t *skdev)
4939 {
4940 Dcmn_err(CE_NOTE, "%s: halt/suspend ......", skdev->name);
4941 }
4942
4943 /*
4944 *
4945 * Name: skd_detach, detaches driver from the system.
4946 *
4947 * Inputs: dip - device info structure.
4948 *
4949 * Returns: DDI_SUCCESS on successful detach otherwise DDI_FAILURE.
4950 *
4951 */
4952 static int
skd_detach(dev_info_t * dip,ddi_detach_cmd_t cmd)4953 skd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
4954 {
4955 skd_buf_private_t *pbuf;
4956 skd_device_t *skdev;
4957 int instance;
4958 timeout_id_t timer_id = NULL;
4959 int rv1 = DDI_SUCCESS;
4960 struct skd_special_context *skspcl;
4961
4962 instance = ddi_get_instance(dip);
4963
4964 skdev = ddi_get_soft_state(skd_state, instance);
4965 if (skdev == NULL) {
4966 cmn_err(CE_WARN, "!detach failed: NULL skd state");
4967
4968 return (DDI_FAILURE);
4969 }
4970
4971 Dcmn_err(CE_CONT, "skd_detach(%d): entered", instance);
4972
4973 switch (cmd) {
4974 case DDI_DETACH:
4975 /* Test for packet cache inuse. */
4976 ADAPTER_STATE_LOCK(skdev);
4977
4978 /* Stop command/event processing. */
4979 skdev->flags |= (SKD_SUSPENDED | SKD_CMD_ABORT_TMO);
4980
4981 /* Disable driver timer if no adapters. */
4982 if (skdev->skd_timer_timeout_id != 0) {
4983 timer_id = skdev->skd_timer_timeout_id;
4984 skdev->skd_timer_timeout_id = 0;
4985 }
4986 ADAPTER_STATE_UNLOCK(skdev);
4987
4988 if (timer_id != 0) {
4989 (void) untimeout(timer_id);
4990 }
4991
4992 #ifdef SKD_PM
4993 if (skdev->power_level != LOW_POWER_LEVEL) {
4994 skd_halt(skdev);
4995 skdev->power_level = LOW_POWER_LEVEL;
4996 }
4997 #endif
4998 skspcl = &skdev->internal_skspcl;
4999 skd_send_internal_skspcl(skdev, skspcl, SYNCHRONIZE_CACHE);
5000
5001 skd_stop_device(skdev);
5002
5003 /*
5004 * Clear request queue.
5005 */
5006 while (!SIMPLEQ_EMPTY(&skdev->waitqueue)) {
5007 pbuf = skd_get_queued_pbuf(skdev);
5008 skd_end_request_abnormal(skdev, pbuf, ECANCELED,
5009 SKD_IODONE_WNIOC);
5010 Dcmn_err(CE_NOTE,
5011 "detach: cancelled pbuf %p %ld <%s> %lld\n",
5012 (void *)pbuf, pbuf->x_xfer->x_nblks,
5013 (pbuf->dir & B_READ) ? "Read" : "Write",
5014 pbuf->x_xfer->x_blkno);
5015 }
5016
5017 skd_bd_detach(skdev);
5018
5019 skd_dealloc_resources(dip, skdev, skdev->progress, instance);
5020
5021 if ((skdev->flags & SKD_MUTEX_DESTROYED) == 0) {
5022 skd_destroy_mutex(skdev);
5023 }
5024
5025 ddi_soft_state_free(skd_state, instance);
5026
5027 skd_exit();
5028
5029 break;
5030
5031 case DDI_SUSPEND:
5032 /* Block timer. */
5033
5034 ADAPTER_STATE_LOCK(skdev);
5035 skdev->flags |= SKD_SUSPENDED;
5036
5037 /* Disable driver timer if last adapter. */
5038 if (skdev->skd_timer_timeout_id != 0) {
5039 timer_id = skdev->skd_timer_timeout_id;
5040 skdev->skd_timer_timeout_id = 0;
5041 }
5042 ADAPTER_STATE_UNLOCK(skdev);
5043
5044 if (timer_id != 0) {
5045 (void) untimeout(timer_id);
5046 }
5047
5048 ddi_prop_remove_all(dip);
5049
5050 skd_halt(skdev);
5051
5052 break;
5053 default:
5054 rv1 = DDI_FAILURE;
5055 break;
5056 }
5057
5058 if (rv1 != DDI_SUCCESS) {
5059 cmn_err(CE_WARN, "!skd_detach, failed, rv1=%x", rv1);
5060 } else {
5061 Dcmn_err(CE_CONT, "skd_detach: exiting");
5062 }
5063
5064 if (rv1 != DDI_SUCCESS)
5065 return (DDI_FAILURE);
5066
5067 return (rv1);
5068 }
5069
5070 /*
5071 *
5072 * Name: skd_devid_init, calls skd_setup_devid to setup
5073 * the device's devid structure.
5074 *
5075 * Inputs: arg - device state structure.
5076 * dip - dev_info structure.
5077 * devid - devid structure.
5078 *
5079 * Returns: Nothing.
5080 *
5081 */
5082 /* ARGSUSED */ /* Upstream common source with other platforms. */
5083 static int
skd_devid_init(void * arg,dev_info_t * dip,ddi_devid_t * devid)5084 skd_devid_init(void *arg, dev_info_t *dip, ddi_devid_t *devid)
5085 {
5086 skd_device_t *skdev = arg;
5087
5088 (void) skd_setup_devid(skdev, devid);
5089
5090 return (0);
5091 }
5092
5093 /*
5094 *
5095 * Name: skd_bd_driveinfo, retrieves device's info.
5096 *
5097 * Inputs: drive - drive data structure.
5098 * arg - device state structure.
5099 *
5100 * Returns: Nothing.
5101 *
5102 */
5103 static void
skd_bd_driveinfo(void * arg,bd_drive_t * drive)5104 skd_bd_driveinfo(void *arg, bd_drive_t *drive)
5105 {
5106 skd_device_t *skdev = arg;
5107
5108 drive->d_qsize = (skdev->queue_depth_limit * 4) / 5;
5109 drive->d_maxxfer = SKD_DMA_MAXXFER;
5110 drive->d_removable = B_FALSE;
5111 drive->d_hotpluggable = B_FALSE;
5112 drive->d_target = 0;
5113 drive->d_lun = 0;
5114
5115 if (skdev->inquiry_is_valid != 0) {
5116 drive->d_vendor = skdev->inq_vendor_id;
5117 drive->d_vendor_len = strlen(drive->d_vendor);
5118
5119 drive->d_product = skdev->inq_product_id;
5120 drive->d_product_len = strlen(drive->d_product);
5121
5122 drive->d_serial = skdev->inq_serial_num;
5123 drive->d_serial_len = strlen(drive->d_serial);
5124
5125 drive->d_revision = skdev->inq_product_rev;
5126 drive->d_revision_len = strlen(drive->d_revision);
5127 }
5128 }
5129
5130 /*
5131 *
5132 * Name: skd_bd_mediainfo, retrieves device media info.
5133 *
5134 * Inputs: arg - device state structure.
5135 * media - container for media info.
5136 *
5137 * Returns: Zero.
5138 *
5139 */
5140 static int
skd_bd_mediainfo(void * arg,bd_media_t * media)5141 skd_bd_mediainfo(void *arg, bd_media_t *media)
5142 {
5143 skd_device_t *skdev = arg;
5144
5145 media->m_nblks = skdev->Nblocks;
5146 media->m_blksize = 512;
5147 media->m_pblksize = 4096;
5148 media->m_readonly = B_FALSE;
5149 media->m_solidstate = B_TRUE;
5150
5151 return (0);
5152 }
5153
5154 /*
5155 *
5156 * Name: skd_rw, performs R/W requests for blkdev driver.
5157 *
5158 * Inputs: skdev - device state structure.
5159 * xfer - tranfer structure.
5160 * dir - I/O direction.
5161 *
5162 * Returns: EAGAIN if device is not online. EIO if blkdev wants us to
5163 * be a dump device (for now).
5164 * Value returned by skd_start().
5165 *
5166 */
5167 static int
skd_rw(skd_device_t * skdev,bd_xfer_t * xfer,int dir)5168 skd_rw(skd_device_t *skdev, bd_xfer_t *xfer, int dir)
5169 {
5170 skd_buf_private_t *pbuf;
5171
5172 /*
5173 * The x_flags structure element is not defined in Oracle Solaris
5174 */
5175 /* We'll need to fix this in order to support dump on this device. */
5176 if (xfer->x_flags & BD_XFER_POLL)
5177 return (EIO);
5178
5179 if (skdev->state != SKD_DRVR_STATE_ONLINE) {
5180 Dcmn_err(CE_NOTE, "Device - not ONLINE");
5181
5182 skd_request_fn_not_online(skdev);
5183
5184 return (EAGAIN);
5185 }
5186
5187 pbuf = kmem_zalloc(sizeof (skd_buf_private_t), KM_NOSLEEP);
5188 if (pbuf == NULL)
5189 return (ENOMEM);
5190
5191 WAITQ_LOCK(skdev);
5192 pbuf->dir = dir;
5193 pbuf->x_xfer = xfer;
5194
5195 skd_queue(skdev, pbuf);
5196 skdev->ios_queued++;
5197 WAITQ_UNLOCK(skdev);
5198
5199 skd_start(skdev);
5200
5201 return (0);
5202 }
5203
5204 /*
5205 *
5206 * Name: skd_bd_read, performs blkdev read requests.
5207 *
5208 * Inputs: arg - device state structure.
5209 * xfer - tranfer request structure.
5210 *
5211 * Returns: Value return by skd_rw().
5212 *
5213 */
5214 static int
skd_bd_read(void * arg,bd_xfer_t * xfer)5215 skd_bd_read(void *arg, bd_xfer_t *xfer)
5216 {
5217 return (skd_rw(arg, xfer, B_READ));
5218 }
5219
5220 /*
5221 *
5222 * Name: skd_bd_write, performs blkdev write requests.
5223 *
5224 * Inputs: arg - device state structure.
5225 * xfer - tranfer request structure.
5226 *
5227 * Returns: Value return by skd_rw().
5228 *
5229 */
5230 static int
skd_bd_write(void * arg,bd_xfer_t * xfer)5231 skd_bd_write(void *arg, bd_xfer_t *xfer)
5232 {
5233 return (skd_rw(arg, xfer, B_WRITE));
5234 }
5235