xref: /dragonfly/sys/bus/cam/cam_periph.c (revision aec00d3271fe6108453c4ebf45b9e31be6e9e578)
1 /*
2  * Common functions for CAM "type" (peripheral) drivers.
3  *
4  * Copyright (c) 1997, 1998 Justin T. Gibbs.
5  * Copyright (c) 1997, 1998, 1999, 2000 Kenneth D. Merry.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions, and the following disclaimer,
13  *    without modification, immediately at the beginning of the file.
14  * 2. The name of the author may not be used to endorse or promote products
15  *    derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * $FreeBSD: src/sys/cam/cam_periph.c,v 1.70 2008/02/12 11:07:33 raj Exp $
30  */
31 
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/types.h>
35 #include <sys/malloc.h>
36 #include <sys/kernel.h>
37 #include <sys/lock.h>
38 #include <sys/buf.h>
39 #include <sys/proc.h>
40 #include <sys/devicestat.h>
41 #include <sys/bus.h>
42 #include <vm/vm.h>
43 #include <vm/vm_extern.h>
44 
45 #include "cam.h"
46 #include "cam_ccb.h"
47 #include "cam_xpt_periph.h"
48 #include "cam_periph.h"
49 #include "cam_debug.h"
50 #include "cam_sim.h"
51 
52 #include <bus/cam/scsi/scsi_all.h>
53 #include <bus/cam/scsi/scsi_message.h>
54 #include <bus/cam/scsi/scsi_pass.h>
55 
56 static    u_int               camperiphnextunit(struct periph_driver *p_drv,
57                                                     u_int newunit, int wired,
58                                                     path_id_t pathid, target_id_t target,
59                                                     lun_id_t lun);
60 static    u_int               camperiphunit(struct periph_driver *p_drv,
61                                               struct cam_sim *sim, path_id_t pathid,
62                                               target_id_t target, lun_id_t lun);
63 static    void                camperiphdone(struct cam_periph *periph,
64                                                   union ccb *done_ccb);
65 static  void                  camperiphfree(struct cam_periph *periph);
66 static int                    camperiphscsistatuserror(union ccb *ccb,
67                                                              cam_flags camflags,
68                                                              u_int32_t sense_flags,
69                                                              union ccb *save_ccb,
70                                                              int *openings,
71                                                              u_int32_t *relsim_flags,
72                                                              u_int32_t *timeout);
73 static    int                 camperiphscsisenseerror(union ccb *ccb,
74                                                           cam_flags camflags,
75                                                           u_int32_t sense_flags,
76                                                           union ccb *save_ccb,
77                                                           int *openings,
78                                                           u_int32_t *relsim_flags,
79                                                           u_int32_t *timeout);
80 static void cam_periph_unmapbufs(struct cam_periph_map_info *mapinfo,
81                                          u_int8_t ***data_ptrs, int numbufs);
82 
83 static int nperiph_drivers;
84 struct periph_driver **periph_drivers;
85 
86 MALLOC_DEFINE(M_CAMPERIPH, "CAM periph", "CAM peripheral buffers");
87 
88 static int periph_selto_delay = 1000;
89 TUNABLE_INT("kern.cam.periph_selto_delay", &periph_selto_delay);
90 static int periph_noresrc_delay = 500;
91 TUNABLE_INT("kern.cam.periph_noresrc_delay", &periph_noresrc_delay);
92 static int periph_busy_delay = 500;
93 TUNABLE_INT("kern.cam.periph_busy_delay", &periph_busy_delay);
94 
95 /*
96  * This is a horrible hack.  The CAM code was just bulk-copying the ccb
97  * to 'restore' it from the saved version.  This completely destroys list
98  * linkages and such, so hack the hack to not copy-over fields that cannot
99  * be safely copied over.
100  *
101  * This fixes list races when scsi errors occur simultaneously on multiple
102  * requests.
103  */
104 #define RESTORE_CCB(saved, ccbh, field) \
105           bcopy(&(saved)->field, &(ccbh)->field, sizeof((ccbh)->field))
106 
107 #define saved_ccb_ptr ppriv_ptr0
108 
109 static void
restore_ccb(struct ccb_hdr * ccb_h)110 restore_ccb(struct ccb_hdr *ccb_h)
111 {
112           struct ccb_hdr *saved;
113 
114           saved = ccb_h->saved_ccb_ptr;
115           bcopy(saved + 1, ccb_h + 1, sizeof(union ccb) - sizeof(*saved));
116           RESTORE_CCB(saved, ccb_h, retry_count);
117           RESTORE_CCB(saved, ccb_h, cbfcnp);
118           RESTORE_CCB(saved, ccb_h, func_code);
119           RESTORE_CCB(saved, ccb_h, status);
120           RESTORE_CCB(saved, ccb_h, path);
121           RESTORE_CCB(saved, ccb_h, path_id);
122           RESTORE_CCB(saved, ccb_h, target_id);
123           RESTORE_CCB(saved, ccb_h, target_lun);
124           RESTORE_CCB(saved, ccb_h, flags);
125           RESTORE_CCB(saved, ccb_h, periph_priv);
126           RESTORE_CCB(saved, ccb_h, sim_priv);
127           RESTORE_CCB(saved, ccb_h, timeout);
128 }
129 
130 void
periphdriver_register(void * data)131 periphdriver_register(void *data)
132 {
133           struct periph_driver **newdrivers, **old;
134           int ndrivers;
135 
136           ndrivers = nperiph_drivers + 2;
137           newdrivers = kmalloc(sizeof(*newdrivers) * ndrivers, M_CAMPERIPH,
138                                    M_WAITOK);
139           if (periph_drivers)
140                     bcopy(periph_drivers, newdrivers,
141                           sizeof(*newdrivers) * nperiph_drivers);
142           newdrivers[nperiph_drivers] = (struct periph_driver *)data;
143           newdrivers[nperiph_drivers + 1] = NULL;
144           old = periph_drivers;
145           periph_drivers = newdrivers;
146           if (old)
147                     kfree(old, M_CAMPERIPH);
148           nperiph_drivers++;
149 }
150 
151 cam_status
cam_periph_alloc(periph_ctor_t * periph_ctor,periph_oninv_t * periph_oninvalidate,periph_dtor_t * periph_dtor,periph_start_t * periph_start,char * name,cam_periph_type type,struct cam_path * path,ac_callback_t * ac_callback,ac_code code,void * arg)152 cam_periph_alloc(periph_ctor_t *periph_ctor,
153                      periph_oninv_t *periph_oninvalidate,
154                      periph_dtor_t *periph_dtor, periph_start_t *periph_start,
155                      char *name, cam_periph_type type, struct cam_path *path,
156                      ac_callback_t *ac_callback, ac_code code, void *arg)
157 {
158           struct              periph_driver **p_drv;
159           struct              cam_sim *sim;
160           struct              cam_periph *periph;
161           struct              cam_periph *cur_periph;
162           path_id_t path_id;
163           target_id_t         target_id;
164           lun_id_t  lun_id;
165           cam_status          status;
166           u_int               init_level;
167 
168           init_level = 0;
169           /*
170            * Handle Hot-Plug scenarios.  If there is already a peripheral
171            * of our type assigned to this path, we are likely waiting for
172            * final close on an old, invalidated, peripheral.  If this is
173            * the case, queue up a deferred call to the peripheral's async
174            * handler.  If it looks like a mistaken re-allocation, complain.
175            */
176           if ((periph = cam_periph_find(path, name)) != NULL) {
177 
178                     if ((periph->flags & CAM_PERIPH_INVALID) != 0
179                      && (periph->flags & CAM_PERIPH_NEW_DEV_FOUND) == 0) {
180                               periph->flags |= CAM_PERIPH_NEW_DEV_FOUND;
181                               periph->deferred_callback = ac_callback;
182                               periph->deferred_ac = code;
183                               return (CAM_REQ_INPROG);
184                     } else {
185                               kprintf("cam_periph_alloc: attempt to re-allocate "
186                                      "valid device %s%d rejected\n",
187                                      periph->periph_name, periph->unit_number);
188                     }
189                     return (CAM_REQ_INVALID);
190           }
191 
192           periph = kmalloc(sizeof(*periph), M_CAMPERIPH, M_INTWAIT | M_ZERO);
193 
194           init_level++;       /* 1 */
195 
196           xpt_lock_buses();
197           for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) {
198                     if (strcmp((*p_drv)->driver_name, name) == 0)
199                               break;
200           }
201           xpt_unlock_buses();
202 
203           sim = xpt_path_sim(path);
204           CAM_SIM_LOCK(sim);
205           path_id = xpt_path_path_id(path);
206           target_id = xpt_path_target_id(path);
207           lun_id = xpt_path_lun_id(path);
208           cam_init_pinfo(&periph->pinfo);
209           periph->periph_start = periph_start;
210           periph->periph_dtor = periph_dtor;
211           periph->periph_oninval = periph_oninvalidate;
212           periph->type = type;
213           periph->periph_name = name;
214           periph->immediate_priority = CAM_PRIORITY_NONE;
215           periph->refcount = 0;
216           periph->sim = sim;
217           SLIST_INIT(&periph->ccb_list);
218           status = xpt_create_path(&path, periph, path_id, target_id, lun_id);
219           if (status != CAM_REQ_CMP)
220                     goto failure;
221 
222           init_level++;       /* 2 */
223 
224           periph->path = path;
225 
226           /*
227            * Finalize with buses locked.  Allocate unit number and add to
228            * list to reserve the unit number.  Undo later if the XPT fails.
229            */
230           xpt_lock_buses();
231           periph->unit_number = camperiphunit(*p_drv, sim, path_id,
232                                                       target_id, lun_id);
233           cur_periph = TAILQ_FIRST(&(*p_drv)->units);
234           while (cur_periph != NULL &&
235                  cur_periph->unit_number < periph->unit_number) {
236                     cur_periph = TAILQ_NEXT(cur_periph, unit_links);
237           }
238           if (cur_periph != NULL) {
239                     TAILQ_INSERT_BEFORE(cur_periph, periph, unit_links);
240           } else {
241                     TAILQ_INSERT_TAIL(&(*p_drv)->units, periph, unit_links);
242                     (*p_drv)->generation++;
243           }
244           xpt_unlock_buses();
245 
246           status = xpt_add_periph(periph);
247 
248           if (status != CAM_REQ_CMP)
249                     goto failure;
250 
251           init_level++;       /* 3 */
252 
253           status = periph_ctor(periph, arg);
254 
255           if (status == CAM_REQ_CMP)
256                     init_level++; /* 4 */
257 
258 failure:
259           switch (init_level) {
260           case 4:
261                     /* Initialized successfully */
262                     CAM_SIM_UNLOCK(sim);
263                     break;
264           case 3:
265           case 2:
266                     xpt_lock_buses();
267                     TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links);
268                     xpt_unlock_buses();
269                     if (init_level == 3)
270                               xpt_remove_periph(periph);
271                     periph->path = NULL;
272                     /* FALLTHROUGH */
273           case 1:
274                     CAM_SIM_UNLOCK(sim);          /* sim was retrieved from path */
275                     xpt_free_path(path);
276                     kfree(periph, M_CAMPERIPH);
277                     /* FALLTHROUGH */
278           case 0:
279                     /* No cleanup to perform. */
280                     break;
281           default:
282                     panic("cam_periph_alloc: Unknown init level");
283           }
284           return(status);
285 }
286 
287 /*
288  * Find a peripheral structure with the specified path, target, lun,
289  * and (optionally) type.  If the name is NULL, this function will return
290  * the first peripheral driver that matches the specified path.
291  */
292 struct cam_periph *
cam_periph_find(struct cam_path * path,char * name)293 cam_periph_find(struct cam_path *path, char *name)
294 {
295           struct periph_driver **p_drv;
296           struct cam_periph *periph;
297 
298           xpt_lock_buses();
299           for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) {
300                     if (name != NULL && (strcmp((*p_drv)->driver_name, name) != 0))
301                               continue;
302 
303                     TAILQ_FOREACH(periph, &(*p_drv)->units, unit_links) {
304                               if (xpt_path_comp(periph->path, path) == 0) {
305                                         xpt_unlock_buses();
306                                         return(periph);
307                               }
308                     }
309                     if (name != NULL) {
310                               xpt_unlock_buses();
311                               return(NULL);
312                     }
313           }
314           xpt_unlock_buses();
315           return(NULL);
316 }
317 
318 cam_status
cam_periph_acquire(struct cam_periph * periph)319 cam_periph_acquire(struct cam_periph *periph)
320 {
321           if (periph == NULL)
322                     return(CAM_REQ_CMP_ERR);
323 
324           xpt_lock_buses();
325           periph->refcount++;
326           xpt_unlock_buses();
327 
328           return(CAM_REQ_CMP);
329 }
330 
331 /*
332  * Release the peripheral.  The XPT is not locked and the SIM may or may
333  * not be locked on entry.
334  *
335  * The last release on a peripheral marked invalid frees it.  In this
336  * case we must be sure to hold both the XPT lock and the SIM lock,
337  * requiring a bit of fancy footwork if the SIM lock already happens
338  * to be held.
339  */
340 void
cam_periph_release(struct cam_periph * periph)341 cam_periph_release(struct cam_periph *periph)
342 {
343           struct cam_sim *sim;
344           int doun;
345 
346           while (periph) {
347                     /*
348                      * First try the critical path case
349                      */
350                     sim = periph->sim;
351                     xpt_lock_buses();
352                     if ((periph->flags & CAM_PERIPH_INVALID) == 0 ||
353                         periph->refcount != 1) {
354                               --periph->refcount;
355                               xpt_unlock_buses();
356                               break;
357                     }
358 
359                     /*
360                      * Otherwise we also need to free the peripheral and must
361                      * acquire the sim lock and xpt lock in the correct order
362                      * to do so.
363                      *
364                      * The condition must be re-checked after the locks have
365                      * been reacquired.
366                      */
367                     xpt_unlock_buses();
368                     doun = CAM_SIM_COND_LOCK(sim);
369                     xpt_lock_buses();
370                     --periph->refcount;
371                     if ((periph->flags & CAM_PERIPH_INVALID) &&
372                         periph->refcount == 0) {
373                               camperiphfree(periph);
374                     }
375                     xpt_unlock_buses();
376                     CAM_SIM_COND_UNLOCK(sim, doun);
377                     break;
378           }
379 }
380 
381 int
cam_periph_hold(struct cam_periph * periph,int flags)382 cam_periph_hold(struct cam_periph *periph, int flags)
383 {
384           int error;
385 
386           sim_lock_assert_owned(periph->sim->lock);
387 
388           /*
389            * Increment the reference count on the peripheral
390            * while we wait for our lock attempt to succeed
391            * to ensure the peripheral doesn't disappear out
392            * from user us while we sleep.
393            */
394 
395           if (cam_periph_acquire(periph) != CAM_REQ_CMP)
396                     return (ENXIO);
397 
398           while ((periph->flags & CAM_PERIPH_LOCKED) != 0) {
399                     periph->flags |= CAM_PERIPH_LOCK_WANTED;
400                     if ((error = sim_lock_sleep(periph, flags, "caplck", 0,
401                                                       periph->sim->lock)) != 0) {
402                               cam_periph_release(periph);
403                               return (error);
404                     }
405           }
406 
407           periph->flags |= CAM_PERIPH_LOCKED;
408           return (0);
409 }
410 
411 void
cam_periph_unhold(struct cam_periph * periph,int unlock)412 cam_periph_unhold(struct cam_periph *periph, int unlock)
413 {
414           struct cam_sim *sim;
415 
416           sim_lock_assert_owned(periph->sim->lock);
417           periph->flags &= ~CAM_PERIPH_LOCKED;
418           if ((periph->flags & CAM_PERIPH_LOCK_WANTED) != 0) {
419                     periph->flags &= ~CAM_PERIPH_LOCK_WANTED;
420                     wakeup(periph);
421           }
422           if (unlock) {
423                     sim = periph->sim;
424                     cam_periph_release(periph);
425                     /* periph may be garbage now */
426                     CAM_SIM_UNLOCK(sim);
427           } else {
428                     cam_periph_release(periph);
429           }
430 }
431 
432 /*
433  * Look for the next unit number that is not currently in use for this
434  * peripheral type starting at "newunit".  Also exclude unit numbers that
435  * are reserved by for future "hardwiring" unless we already know that this
436  * is a potential wired device.  Only assume that the device is "wired" the
437  * first time through the loop since after that we'll be looking at unit
438  * numbers that did not match a wiring entry.
439  */
440 static u_int
camperiphnextunit(struct periph_driver * p_drv,u_int newunit,int wired,path_id_t pathid,target_id_t target,lun_id_t lun)441 camperiphnextunit(struct periph_driver *p_drv, u_int newunit, int wired,
442                       path_id_t pathid, target_id_t target, lun_id_t lun)
443 {
444           struct    cam_periph *periph;
445           char      *periph_name;
446           int       i, val, dunit;
447           const char *dname, *strval;
448 
449           periph_name = p_drv->driver_name;
450           for (;;) {
451                     for (periph = TAILQ_FIRST(&p_drv->units);
452                          periph != NULL && periph->unit_number != newunit;
453                          periph = TAILQ_NEXT(periph, unit_links))
454                               ;
455 
456                     if (periph != NULL && periph->unit_number == newunit) {
457                               if (wired != 0) {
458                                         xpt_print(periph->path, "Duplicate Wired "
459                                             "Device entry!\n");
460                                         xpt_print(periph->path, "Second device (%s "
461                                             "device at scbus%d target %d lun %d) will "
462                                             "not be wired\n", periph_name, pathid,
463                                             target, lun);
464                                         wired = 0;
465                               }
466                               ++newunit;
467                               continue;
468                     }
469                     if (wired)
470                               break;
471 
472                     /*
473                      * Don't match entries like "da 4" as a wired down
474                      * device, but do match entries like "da 4 target 5"
475                      * or even "da 4 scbus 1".
476                      */
477                     i = -1;
478                     while ((i = resource_locate(i, periph_name)) != -1) {
479                               dname = resource_query_name(i);
480                               dunit = resource_query_unit(i);
481                               /* if no "target" and no specific scbus, skip */
482                               if (resource_int_value(dname, dunit, "target", &val) &&
483                                   (resource_string_value(dname, dunit, "at",&strval)||
484                                    strcmp(strval, "scbus") == 0)) {
485                                         continue;
486                               }
487                               if (newunit == dunit)
488                                         break;
489                     }
490                     if (i == -1)
491                               break;
492                     ++newunit;
493           }
494           return (newunit);
495 }
496 
497 static u_int
camperiphunit(struct periph_driver * p_drv,struct cam_sim * sim,path_id_t pathid,target_id_t target,lun_id_t lun)498 camperiphunit(struct periph_driver *p_drv,
499                 struct cam_sim *sim, path_id_t pathid,
500                 target_id_t target, lun_id_t lun)
501 {
502           u_int     unit;
503           int       hit, i, val, dunit;
504           const char *dname, *strval;
505           char      pathbuf[32], *periph_name;
506 
507           unit = 0;
508 
509           periph_name = p_drv->driver_name;
510           ksnprintf(pathbuf, sizeof(pathbuf), "scbus%d", pathid);
511           i = -1;
512           for (hit = 0; (i = resource_locate(i, periph_name)) != -1; hit = 0) {
513                     dname = resource_query_name(i);
514                     dunit = resource_query_unit(i);
515                     if (resource_string_value(dname, dunit, "at", &strval) == 0) {
516                               if (strcmp(strval, pathbuf) != 0)
517                                         continue;
518                               hit++;
519                     }
520                     if (resource_int_value(dname, dunit, "target", &val) == 0) {
521                               if (val != target)
522                                         continue;
523                               hit++;
524                     }
525                     if (resource_int_value(dname, dunit, "lun", &val) == 0) {
526                               if (val != lun)
527                                         continue;
528                               hit++;
529                     }
530                     if (hit != 0) {
531                               unit = dunit;
532                               break;
533                     }
534           }
535 
536           /*
537            * If no wired units are in the kernel config do an auto unit
538            * start selection.  We want usb mass storage out of the way
539            * so it doesn't steal low numbered da%d slots from ahci, sili,
540            * or other scsi attachments.
541            */
542           if (hit == 0 && sim) {
543                     if (strncmp(sim->sim_name, "umass", 4) == 0 && unit < 8)
544                               unit = 8;
545           }
546 
547           /*
548            * Either start from 0 looking for the next unit or from
549            * the unit number given in the resource config.  This way,
550            * if we have wildcard matches, we don't return the same
551            * unit number twice.
552            */
553           unit = camperiphnextunit(p_drv, unit, /*wired*/hit, pathid,
554                                          target, lun);
555 
556           return (unit);
557 }
558 
559 void
cam_periph_invalidate(struct cam_periph * periph)560 cam_periph_invalidate(struct cam_periph *periph)
561 {
562           /*
563            * We only call this routine the first time a peripheral is
564            * invalidated.
565            */
566           if (((periph->flags & CAM_PERIPH_INVALID) == 0)
567            && (periph->periph_oninval != NULL))
568                     periph->periph_oninval(periph);
569 
570           periph->flags |= CAM_PERIPH_INVALID;
571           periph->flags &= ~CAM_PERIPH_NEW_DEV_FOUND;
572 
573           xpt_lock_buses();
574           if (periph->refcount == 0)
575                     camperiphfree(periph);
576           else if (periph->refcount < 0)
577                     kprintf("cam_invalidate_periph: refcount < 0!!\n");
578           xpt_unlock_buses();
579 }
580 
581 static void
camperiphfree(struct cam_periph * periph)582 camperiphfree(struct cam_periph *periph)
583 {
584           struct periph_driver **p_drv;
585 
586           for (p_drv = periph_drivers; *p_drv != NULL; p_drv++) {
587                     if (strcmp((*p_drv)->driver_name, periph->periph_name) == 0)
588                               break;
589           }
590 
591           if (*p_drv == NULL) {
592                     kprintf("camperiphfree: attempt to free non-existent periph\n");
593                     return;
594           }
595 
596           TAILQ_REMOVE(&(*p_drv)->units, periph, unit_links);
597           (*p_drv)->generation++;
598           xpt_unlock_buses();
599 
600           if (periph->periph_dtor != NULL)
601                     periph->periph_dtor(periph);
602           xpt_remove_periph(periph);
603 
604           if (periph->flags & CAM_PERIPH_NEW_DEV_FOUND) {
605                     union ccb *ccb = xpt_alloc_ccb();
606                     void *arg;
607 
608                     switch (periph->deferred_ac) {
609                     case AC_FOUND_DEVICE:
610                               ccb->ccb_h.func_code = XPT_GDEV_TYPE;
611                               xpt_setup_ccb(&ccb->ccb_h, periph->path, /*priority*/1);
612                               xpt_action(ccb);
613                               arg = ccb;
614                               break;
615                     case AC_PATH_REGISTERED:
616                               ccb->ccb_h.func_code = XPT_PATH_INQ;
617                               xpt_setup_ccb(&ccb->ccb_h, periph->path, /*priority*/1);
618                               xpt_action(ccb);
619                               arg = ccb;
620                               break;
621                     default:
622                               arg = NULL;
623                               break;
624                     }
625                     periph->deferred_callback(NULL, periph->deferred_ac,
626                                                     periph->path, arg);
627                     xpt_free_ccb(&ccb->ccb_h);
628           }
629           xpt_free_path(periph->path);
630           kfree(periph, M_CAMPERIPH);
631           xpt_lock_buses();
632 }
633 
634 /*
635  * We don't map user pointers into KVM, instead we use pbufs.
636  *
637  * This won't work on physical pointers(?OLD), for now it's
638  * up to the caller to check for that.  (XXX KDM -- should we do that here
639  * instead?)  This also only works for up to MAXPHYS memory.  Since we use
640  * buffers to map stuff in and out, we're limited to the buffer size.
641  */
642 int
cam_periph_mapmem(union ccb * ccb,struct cam_periph_map_info * mapinfo)643 cam_periph_mapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo)
644 {
645           buf_cmd_t cmd[CAM_PERIPH_MAXMAPS];
646           u_int8_t **data_ptrs[CAM_PERIPH_MAXMAPS];
647           u_int32_t lengths[CAM_PERIPH_MAXMAPS];
648           int numbufs;
649           int error;
650           int i;
651           struct buf *bp;
652 
653           switch(ccb->ccb_h.func_code) {
654           case XPT_DEV_MATCH:
655                     if (ccb->cdm.match_buf_len == 0) {
656                               kprintf("cam_periph_mapmem: invalid match buffer "
657                                      "length 0\n");
658                               return(EINVAL);
659                     }
660                     if (ccb->cdm.pattern_buf_len > 0) {
661                               data_ptrs[0] = (void *)&ccb->cdm.patterns;
662                               lengths[0] = ccb->cdm.pattern_buf_len;
663                               mapinfo->dirs[0] = CAM_DIR_OUT;
664                               data_ptrs[1] = (void *)&ccb->cdm.matches;
665                               lengths[1] = ccb->cdm.match_buf_len;
666                               mapinfo->dirs[1] = CAM_DIR_IN;
667                               numbufs = 2;
668                     } else {
669                               data_ptrs[0] = (void *)&ccb->cdm.matches;
670                               lengths[0] = ccb->cdm.match_buf_len;
671                               mapinfo->dirs[0] = CAM_DIR_IN;
672                               numbufs = 1;
673                     }
674                     break;
675           case XPT_SCSI_IO:
676           case XPT_CONT_TARGET_IO:
677                     if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE)
678                               return(0);
679 
680                     data_ptrs[0] = &ccb->csio.data_ptr;
681                     lengths[0] = ccb->csio.dxfer_len;
682                     mapinfo->dirs[0] = ccb->ccb_h.flags & CAM_DIR_MASK;
683                     numbufs = 1;
684                     break;
685           default:
686                     return(EINVAL);
687                     break; /* NOTREACHED */
688           }
689 
690           /*
691            * Check the transfer length and permissions first, so we don't
692            * have to unmap any previously mapped buffers.
693            */
694           for (i = 0; i < numbufs; i++) {
695                     /*
696                      * Its kinda bogus, we need a R+W command.  For now the
697                      * buffer needs some sort of command.  Use BUF_CMD_WRITE
698                      * to indicate a write and BUF_CMD_READ to indicate R+W.
699                      */
700                     cmd[i] = BUF_CMD_WRITE;
701 
702                     if (lengths[i] > MAXPHYS) {
703                               kprintf("cam_periph_mapmem: attempt to map %lu bytes, "
704                                      "which is greater than MAXPHYS(%d)\n",
705                                      (long)(lengths[i] +
706                                      (((vm_offset_t)(*data_ptrs[i])) & PAGE_MASK)),
707                                      MAXPHYS);
708                               return(E2BIG);
709                     }
710 
711                     if (mapinfo->dirs[i] & CAM_DIR_OUT) {
712                               if (!useracc(*data_ptrs[i], lengths[i],
713                                              VM_PROT_READ)) {
714                                         kprintf("cam_periph_mapmem: error, "
715                                                   "address %p, length %lu isn't "
716                                                   "user accessible for READ\n",
717                                                   (void *)*data_ptrs[i],
718                                                   (u_long)lengths[i]);
719                                         return(EACCES);
720                               }
721                     }
722 
723                     if (mapinfo->dirs[i] & CAM_DIR_IN) {
724                               cmd[i] = BUF_CMD_READ;
725                               if (!useracc(*data_ptrs[i], lengths[i],
726                                              VM_PROT_WRITE)) {
727                                         kprintf("cam_periph_mapmem: error, "
728                                                   "address %p, length %lu isn't "
729                                                   "user accessible for WRITE\n",
730                                                   (void *)*data_ptrs[i],
731                                                   (u_long)lengths[i]);
732 
733                                         return(EACCES);
734                               }
735                     }
736 
737           }
738 
739           for (i = 0; i < numbufs; i++) {
740                     /*
741                      * Get the buffer.
742                      */
743                     bp = getpbuf_mem(NULL);
744 
745                     /* save the original user pointer */
746                     mapinfo->saved_ptrs[i] = *data_ptrs[i];
747 
748                     /* set the flags */
749                     bp->b_cmd = cmd[i];
750 
751                     /*
752                      * Always bounce the I/O through kernel memory.
753                      */
754                     bp->b_bcount = lengths[i];
755                     if (mapinfo->dirs[i] & CAM_DIR_OUT) {
756                               error = copyin(*data_ptrs[i], bp->b_data, bp->b_bcount);
757                     } else {
758                               error = 0;
759                     }
760                     if (error) {
761                               relpbuf(bp, NULL);
762                               cam_periph_unmapbufs(mapinfo, data_ptrs, i);
763                               mapinfo->num_bufs_used -= i;
764                               return(error);
765                     }
766 
767                     /* set our pointer to the new mapped area */
768                     *data_ptrs[i] = bp->b_data;
769 
770                     mapinfo->bp[i] = bp;
771                     mapinfo->num_bufs_used++;
772           }
773 
774           return(0);
775 }
776 
777 /*
778  * Unmap memory segments mapped into kernel virtual address space by
779  * cam_periph_mapmem().
780  */
781 void
cam_periph_unmapmem(union ccb * ccb,struct cam_periph_map_info * mapinfo)782 cam_periph_unmapmem(union ccb *ccb, struct cam_periph_map_info *mapinfo)
783 {
784           int numbufs;
785           u_int8_t **data_ptrs[CAM_PERIPH_MAXMAPS];
786 
787           if (mapinfo->num_bufs_used <= 0) {
788                     /* allow ourselves to be swapped once again */
789                     return;
790           }
791 
792           switch (ccb->ccb_h.func_code) {
793           case XPT_DEV_MATCH:
794                     numbufs = min(mapinfo->num_bufs_used, 2);
795 
796                     if (numbufs == 1) {
797                               data_ptrs[0] = (void *)&ccb->cdm.matches;
798                     } else {
799                               data_ptrs[0] = (void *)&ccb->cdm.patterns;
800                               data_ptrs[1] = (void *)&ccb->cdm.matches;
801                     }
802                     break;
803           case XPT_SCSI_IO:
804           case XPT_CONT_TARGET_IO:
805                     data_ptrs[0] = &ccb->csio.data_ptr;
806                     numbufs = min(mapinfo->num_bufs_used, 1);
807                     break;
808           default:
809                     /* allow ourselves to be swapped once again */
810                     return;
811                     break; /* NOTREACHED */
812           }
813           cam_periph_unmapbufs(mapinfo, data_ptrs, numbufs);
814 }
815 
816 static void
cam_periph_unmapbufs(struct cam_periph_map_info * mapinfo,u_int8_t *** data_ptrs,int numbufs)817 cam_periph_unmapbufs(struct cam_periph_map_info *mapinfo,
818                          u_int8_t ***data_ptrs, int numbufs)
819 {
820           struct buf *bp;
821           int i;
822 
823           for (i = 0; i < numbufs; i++) {
824                     bp = mapinfo->bp[i];
825 
826                     /* Set the user's pointer back to the original value */
827                     *data_ptrs[i] = mapinfo->saved_ptrs[i];
828 
829                     if (mapinfo->dirs[i] & CAM_DIR_IN) {
830                               /* XXX return error */
831                               copyout(bp->b_data, *data_ptrs[i], bp->b_bcount);
832                     }
833                     relpbuf(bp, NULL);
834                     mapinfo->bp[i] = NULL;
835           }
836 }
837 
838 union ccb *
cam_periph_getccb(struct cam_periph * periph,u_int32_t priority)839 cam_periph_getccb(struct cam_periph *periph, u_int32_t priority)
840 {
841           struct ccb_hdr *ccb_h;
842 
843           sim_lock_assert_owned(periph->sim->lock);
844           CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("entering cdgetccb\n"));
845 
846           while (SLIST_FIRST(&periph->ccb_list) == NULL) {
847                     if (periph->immediate_priority > priority)
848                               periph->immediate_priority = priority;
849                     xpt_schedule(periph, priority);
850                     if ((SLIST_FIRST(&periph->ccb_list) != NULL)
851                      && (SLIST_FIRST(&periph->ccb_list)->pinfo.priority == priority))
852                               break;
853                     sim_lock_sleep(&periph->ccb_list, 0, "cgticb", 0,
854                                      periph->sim->lock);
855           }
856 
857           ccb_h = SLIST_FIRST(&periph->ccb_list);
858           SLIST_REMOVE_HEAD(&periph->ccb_list, periph_links.sle);
859           return ((union ccb *)ccb_h);
860 }
861 
862 void
cam_periph_ccbwait(union ccb * ccb)863 cam_periph_ccbwait(union ccb *ccb)
864 {
865           struct cam_sim *sim;
866 
867           sim = xpt_path_sim(ccb->ccb_h.path);
868           while ((ccb->ccb_h.pinfo.index != CAM_UNQUEUED_INDEX)
869            || ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG)) {
870                     sim_lock_sleep(&ccb->ccb_h.cbfcnp, 0, "cbwait", 0, sim->lock);
871           }
872 }
873 
874 int
cam_periph_ioctl(struct cam_periph * periph,u_long cmd,caddr_t addr,int (* error_routine)(union ccb * ccb,cam_flags camflags,u_int32_t sense_flags))875 cam_periph_ioctl(struct cam_periph *periph, u_long cmd, caddr_t addr,
876                      int (*error_routine)(union ccb *ccb,
877                                               cam_flags camflags,
878                                               u_int32_t sense_flags))
879 {
880           union ccb                *ccb;
881           int                      error;
882           int                      found;
883 
884           error = found = 0;
885 
886           switch(cmd){
887           case CAMGETPASSTHRU:
888                     ccb = cam_periph_getccb(periph, /* priority */ 1);
889                     xpt_setup_ccb(&ccb->ccb_h,
890                                     ccb->ccb_h.path,
891                                     /*priority*/1);
892                     ccb->ccb_h.func_code = XPT_GDEVLIST;
893 
894                     /*
895                      * Basically, the point of this is that we go through
896                      * getting the list of devices, until we find a passthrough
897                      * device.  In the current version of the CAM code, the
898                      * only way to determine what type of device we're dealing
899                      * with is by its name.
900                      */
901                     while (found == 0) {
902                               ccb->cgdl.index = 0;
903                               ccb->cgdl.status = CAM_GDEVLIST_MORE_DEVS;
904                               while (ccb->cgdl.status == CAM_GDEVLIST_MORE_DEVS) {
905 
906                                         /* we want the next device in the list */
907                                         xpt_action(ccb);
908                                         if (strncmp(ccb->cgdl.periph_name,
909                                             "pass", 4) == 0){
910                                                   found = 1;
911                                                   break;
912                                         }
913                               }
914                               if ((ccb->cgdl.status == CAM_GDEVLIST_LAST_DEVICE) &&
915                                   (found == 0)) {
916                                         ccb->cgdl.periph_name[0] = '\0';
917                                         ccb->cgdl.unit_number = 0;
918                                         break;
919                               }
920                     }
921 
922                     /* copy the result back out */
923                     bcopy(ccb, addr, sizeof(union ccb));
924 
925                     /* and release the ccb */
926                     xpt_release_ccb(ccb);
927 
928                     break;
929           default:
930                     error = ENOTTY;
931                     break;
932           }
933           return(error);
934 }
935 
936 int
cam_periph_runccb(union ccb * ccb,int (* error_routine)(union ccb * ccb,cam_flags camflags,u_int32_t sense_flags),cam_flags camflags,u_int32_t sense_flags,struct devstat * ds)937 cam_periph_runccb(union ccb *ccb,
938                       int (*error_routine)(union ccb *ccb,
939                                                cam_flags camflags,
940                                                u_int32_t sense_flags),
941                       cam_flags camflags, u_int32_t sense_flags,
942                       struct devstat *ds)
943 {
944           struct cam_sim *sim;
945           int error;
946 
947           error = 0;
948           sim = xpt_path_sim(ccb->ccb_h.path);
949           sim_lock_assert_owned(sim->lock);
950 
951           /*
952            * If the user has supplied a stats structure, and if we understand
953            * this particular type of ccb, record the transaction start.
954            */
955           if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO))
956                     devstat_start_transaction(ds);
957 
958           xpt_action(ccb);
959 
960           do {
961                     cam_periph_ccbwait(ccb);
962                     if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP)
963                               error = 0;
964                     else if (error_routine != NULL)
965                               error = (*error_routine)(ccb, camflags, sense_flags);
966                     else
967                               error = 0;
968 
969           } while (error == ERESTART);
970 
971           if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0)
972                     cam_release_devq(ccb->ccb_h.path,
973                                          /* relsim_flags */0,
974                                          /* openings */0,
975                                          /* timeout */0,
976                                          /* getcount_only */ FALSE);
977 
978           if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO))
979                     devstat_end_transaction(ds,
980                                                   ccb->csio.dxfer_len,
981                                                   ccb->csio.tag_action & 0xf,
982                                                   ((ccb->ccb_h.flags & CAM_DIR_MASK) ==
983                                                   CAM_DIR_NONE) ?  DEVSTAT_NO_DATA :
984                                                   (ccb->ccb_h.flags & CAM_DIR_OUT) ?
985                                                   DEVSTAT_WRITE :
986                                                   DEVSTAT_READ);
987 
988           return(error);
989 }
990 
991 void
cam_freeze_devq(struct cam_path * path)992 cam_freeze_devq(struct cam_path *path)
993 {
994           struct ccb_hdr *ccb_h;
995 
996           ccb_h = &xpt_alloc_ccb()->ccb_h;
997           xpt_setup_ccb(ccb_h, path, /*priority*/1);
998           ccb_h->func_code = XPT_NOOP;
999           ccb_h->flags = CAM_DEV_QFREEZE;
1000           xpt_action((union ccb *)ccb_h);
1001 
1002           xpt_free_ccb(ccb_h);
1003 }
1004 
1005 u_int32_t
cam_release_devq(struct cam_path * path,u_int32_t relsim_flags,u_int32_t openings,u_int32_t timeout,int getcount_only)1006 cam_release_devq(struct cam_path *path, u_int32_t relsim_flags,
1007                      u_int32_t openings, u_int32_t timeout,
1008                      int getcount_only)
1009 {
1010           struct ccb_relsim *crs;
1011           uint32_t cnt;
1012 
1013           crs = &xpt_alloc_ccb()->crs;
1014 
1015           xpt_setup_ccb(&crs->ccb_h, path, /*priority*/1);
1016           crs->ccb_h.func_code = XPT_REL_SIMQ;
1017           crs->ccb_h.flags = getcount_only ? CAM_DEV_QFREEZE : 0;
1018           crs->release_flags = relsim_flags;
1019           crs->openings = openings;
1020           crs->release_timeout = timeout;
1021           xpt_action((union ccb *)crs);
1022           cnt = crs->qfrozen_cnt;
1023 
1024           xpt_free_ccb(&crs->ccb_h);
1025 
1026           return cnt;
1027 }
1028 
1029 static void
camperiphdone(struct cam_periph * periph,union ccb * done_ccb)1030 camperiphdone(struct cam_periph *periph, union ccb *done_ccb)
1031 {
1032           union ccb      *saved_ccb;
1033           cam_status          status;
1034           int                 frozen;
1035           int                 sense;
1036           struct scsi_start_stop_unit *scsi_cmd;
1037           u_int32_t relsim_flags, timeout;
1038           u_int32_t qfrozen_cnt;
1039           int                 xpt_done_ccb;
1040 
1041           xpt_done_ccb = FALSE;
1042           status = done_ccb->ccb_h.status;
1043           frozen = (status & CAM_DEV_QFRZN) != 0;
1044           sense  = (status & CAM_AUTOSNS_VALID) != 0;
1045           status &= CAM_STATUS_MASK;
1046 
1047           timeout = 0;
1048           relsim_flags = 0;
1049           saved_ccb = (union ccb *)done_ccb->ccb_h.saved_ccb_ptr;
1050 
1051           /*
1052            * Unfreeze the queue once if it is already frozen..
1053            */
1054           if (frozen != 0) {
1055                     qfrozen_cnt = cam_release_devq(done_ccb->ccb_h.path,
1056                                                         /*relsim_flags*/0,
1057                                                         /*openings*/0,
1058                                                         /*timeout*/0,
1059                                                         /*getcount_only*/0);
1060           }
1061 
1062           switch (status) {
1063           case CAM_REQ_CMP:
1064           {
1065                     /*
1066                      * If we have successfully taken a device from the not
1067                      * ready to ready state, re-scan the device and re-get
1068                      * the inquiry information.  Many devices (mostly disks)
1069                      * don't properly report their inquiry information unless
1070                      * they are spun up.
1071                      *
1072                      * If we manually retrieved sense into a CCB and got
1073                      * something other than "NO SENSE" send the updated CCB
1074                      * back to the client via xpt_done() to be processed via
1075                      * the error recovery code again.
1076                      */
1077                     if (done_ccb->ccb_h.func_code == XPT_SCSI_IO) {
1078                               scsi_cmd = (struct scsi_start_stop_unit *)
1079                                                   &done_ccb->csio.cdb_io.cdb_bytes;
1080 
1081                               if (scsi_cmd->opcode == START_STOP_UNIT)
1082                                         xpt_async(AC_INQ_CHANGED,
1083                                                     done_ccb->ccb_h.path, NULL);
1084                               if (scsi_cmd->opcode == REQUEST_SENSE) {
1085                                         u_int sense_key;
1086 
1087                                         sense_key = saved_ccb->csio.sense_data.flags;
1088                                         sense_key &= SSD_KEY;
1089                                         if (sense_key != SSD_KEY_NO_SENSE) {
1090                                                   saved_ccb->ccb_h.status |=
1091                                                       CAM_AUTOSNS_VALID;
1092 #if 0
1093                                                   xpt_print(saved_ccb->ccb_h.path,
1094                                                       "Recovered Sense\n");
1095                                                   scsi_sense_print(&saved_ccb->csio);
1096                                                   cam_error_print(saved_ccb, CAM_ESF_ALL,
1097                                                                       CAM_EPF_ALL);
1098 #endif
1099                                                   xpt_done_ccb = TRUE;
1100                                         }
1101                               }
1102                     }
1103                     restore_ccb(&done_ccb->ccb_h);
1104 
1105                     periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG;
1106 
1107                     if (xpt_done_ccb == FALSE)
1108                               xpt_action(done_ccb);
1109 
1110                     break;
1111           }
1112           case CAM_SCSI_STATUS_ERROR:
1113                     scsi_cmd = (struct scsi_start_stop_unit *)
1114                                         &done_ccb->csio.cdb_io.cdb_bytes;
1115                     if (sense != 0) {
1116                               struct ccb_getdev *cgd;
1117                               struct scsi_sense_data *sense;
1118                               int    error_code, sense_key, asc, ascq;
1119                               scsi_sense_action err_action;
1120 
1121                               cgd = &xpt_alloc_ccb()->cgd;
1122                               sense = &done_ccb->csio.sense_data;
1123                               scsi_extract_sense(sense, &error_code,
1124                                                      &sense_key, &asc, &ascq);
1125 
1126                               /*
1127                                * Grab the inquiry data for this device.
1128                                */
1129                               xpt_setup_ccb(&cgd->ccb_h, done_ccb->ccb_h.path,
1130                                               /*priority*/ 1);
1131                               cgd->ccb_h.func_code = XPT_GDEV_TYPE;
1132                               xpt_action((union ccb *)cgd);
1133                               err_action = scsi_error_action(&done_ccb->csio,
1134                                                                    &cgd->inq_data, 0);
1135                               xpt_free_ccb(&cgd->ccb_h);
1136                               cgd = NULL;         /* safety */
1137 
1138                               /*
1139                                * If the error is "invalid field in CDB",
1140                                * and the load/eject flag is set, turn the
1141                                * flag off and try again.  This is just in
1142                                * case the drive in question barfs on the
1143                                * load eject flag.  The CAM code should set
1144                                * the load/eject flag by default for
1145                                * removable media.
1146                                */
1147 
1148                               /* XXX KDM
1149                                * Should we check to see what the specific
1150                                * scsi status is??  Or does it not matter
1151                                * since we already know that there was an
1152                                * error, and we know what the specific
1153                                * error code was, and we know what the
1154                                * opcode is..
1155                                */
1156                               if ((scsi_cmd->opcode == START_STOP_UNIT) &&
1157                                   ((scsi_cmd->how & SSS_LOEJ) != 0) &&
1158                                    (asc == 0x24) && (ascq == 0x00) &&
1159                                    (done_ccb->ccb_h.retry_count > 0)) {
1160 
1161                                         scsi_cmd->how &= ~SSS_LOEJ;
1162 
1163                                         xpt_action(done_ccb);
1164 
1165                               } else if ((done_ccb->ccb_h.retry_count > 1)
1166                                         && ((err_action & SS_MASK) != SS_FAIL)) {
1167 
1168                                         /*
1169                                          * In this case, the error recovery
1170                                          * command failed, but we've got
1171                                          * some retries left on it.  Give
1172                                          * it another try unless this is an
1173                                          * unretryable error.
1174                                          */
1175 
1176                                         /* set the timeout to .5 sec */
1177                                         relsim_flags =
1178                                                   RELSIM_RELEASE_AFTER_TIMEOUT;
1179                                         timeout = 500;
1180 
1181                                         xpt_action(done_ccb);
1182 
1183                                         break;
1184 
1185                               } else {
1186                                         /*
1187                                          * Perform the final retry with the original
1188                                          * CCB so that final error processing is
1189                                          * performed by the owner of the CCB.
1190                                          */
1191                                         restore_ccb(&done_ccb->ccb_h);
1192 
1193                                         periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG;
1194 
1195                                         xpt_action(done_ccb);
1196                               }
1197                     } else {
1198                               /*
1199                                * Eh??  The command failed, but we don't
1200                                * have any sense.  What's up with that?
1201                                * Fire the CCB again to return it to the
1202                                * caller.
1203                                */
1204                               restore_ccb(&done_ccb->ccb_h);
1205 
1206                               periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG;
1207 
1208                               xpt_action(done_ccb);
1209 
1210                     }
1211                     break;
1212           default:
1213                     restore_ccb(&done_ccb->ccb_h);
1214 
1215                     periph->flags &= ~CAM_PERIPH_RECOVERY_INPROG;
1216 
1217                     xpt_action(done_ccb);
1218 
1219                     break;
1220           }
1221 
1222           /* decrement the retry count */
1223           /*
1224            * XXX This isn't appropriate in all cases.  Restructure,
1225            *     so that the retry count is only decremented on an
1226            *     actual retry.  Remeber that the orignal ccb had its
1227            *     retry count dropped before entering recovery, so
1228            *     doing it again is a bug.
1229            */
1230           if (done_ccb->ccb_h.retry_count > 0)
1231                     done_ccb->ccb_h.retry_count--;
1232 
1233           qfrozen_cnt = cam_release_devq(done_ccb->ccb_h.path,
1234                                               /*relsim_flags*/relsim_flags,
1235                                               /*openings*/0,
1236                                               /*timeout*/timeout,
1237                                               /*getcount_only*/0);
1238           if (xpt_done_ccb == TRUE)
1239                     (*done_ccb->ccb_h.cbfcnp)(periph, done_ccb);
1240 }
1241 
1242 /*
1243  * Generic Async Event handler.  Peripheral drivers usually
1244  * filter out the events that require personal attention,
1245  * and leave the rest to this function.
1246  */
1247 void
cam_periph_async(struct cam_periph * periph,u_int32_t code,struct cam_path * path,void * arg)1248 cam_periph_async(struct cam_periph *periph, u_int32_t code,
1249                      struct cam_path *path, void *arg)
1250 {
1251           switch (code) {
1252           case AC_LOST_DEVICE:
1253                     cam_periph_invalidate(periph);
1254                     break;
1255           case AC_SENT_BDR:
1256           case AC_BUS_RESET:
1257           {
1258                     cam_periph_bus_settle(periph, scsi_delay);
1259                     break;
1260           }
1261           default:
1262                     break;
1263           }
1264 }
1265 
1266 void
cam_periph_bus_settle(struct cam_periph * periph,u_int bus_settle)1267 cam_periph_bus_settle(struct cam_periph *periph, u_int bus_settle)
1268 {
1269           struct ccb_getdevstats *cgds;
1270 
1271           cgds = &xpt_alloc_ccb()->cgds;
1272           xpt_setup_ccb(&cgds->ccb_h, periph->path, /*priority*/1);
1273           cgds->ccb_h.func_code = XPT_GDEV_STATS;
1274           xpt_action((union ccb *)cgds);
1275           cam_periph_freeze_after_event(periph, &cgds->last_reset, bus_settle);
1276           xpt_free_ccb(&cgds->ccb_h);
1277 }
1278 
1279 void
cam_periph_freeze_after_event(struct cam_periph * periph,struct timeval * event_time,u_int duration_ms)1280 cam_periph_freeze_after_event(struct cam_periph *periph,
1281                                     struct timeval* event_time, u_int duration_ms)
1282 {
1283           struct timeval delta;
1284           struct timeval duration_tv;
1285 
1286           microuptime(&delta);
1287           timevalsub(&delta, event_time);
1288           duration_tv.tv_sec = duration_ms / 1000;
1289           duration_tv.tv_usec = (duration_ms % 1000) * 1000;
1290           if (timevalcmp(&delta, &duration_tv, <)) {
1291                     timevalsub(&duration_tv, &delta);
1292 
1293                     duration_ms = duration_tv.tv_sec * 1000;
1294                     duration_ms += duration_tv.tv_usec / 1000;
1295                     cam_freeze_devq(periph->path);
1296                     cam_release_devq(periph->path,
1297                                         RELSIM_RELEASE_AFTER_TIMEOUT,
1298                                         /*reduction*/0,
1299                                         /*timeout*/duration_ms,
1300                                         /*getcount_only*/0);
1301           }
1302 
1303 }
1304 
1305 static int
camperiphscsistatuserror(union ccb * ccb,cam_flags camflags,u_int32_t sense_flags,union ccb * save_ccb,int * openings,u_int32_t * relsim_flags,u_int32_t * timeout)1306 camperiphscsistatuserror(union ccb *ccb, cam_flags camflags,
1307                                u_int32_t sense_flags, union ccb *save_ccb,
1308                                int *openings, u_int32_t *relsim_flags,
1309                                u_int32_t *timeout)
1310 {
1311           int error;
1312 
1313           switch (ccb->csio.scsi_status) {
1314           case SCSI_STATUS_OK:
1315           case SCSI_STATUS_COND_MET:
1316           case SCSI_STATUS_INTERMED:
1317           case SCSI_STATUS_INTERMED_COND_MET:
1318                     error = 0;
1319                     break;
1320           case SCSI_STATUS_CMD_TERMINATED:
1321           case SCSI_STATUS_CHECK_COND:
1322                     error = camperiphscsisenseerror(ccb,
1323                                                           camflags,
1324                                                           sense_flags,
1325                                                           save_ccb,
1326                                                           openings,
1327                                                           relsim_flags,
1328                                                           timeout);
1329                     break;
1330           case SCSI_STATUS_QUEUE_FULL:
1331           {
1332                     /* no decrement */
1333                     struct ccb_getdevstats *cgds;
1334 
1335                     cgds = &xpt_alloc_ccb()->cgds;
1336 
1337                     /*
1338                      * First off, find out what the current
1339                      * transaction counts are.
1340                      */
1341                     xpt_setup_ccb(&cgds->ccb_h, ccb->ccb_h.path, /*priority*/1);
1342                     cgds->ccb_h.func_code = XPT_GDEV_STATS;
1343                     xpt_action((union ccb *)cgds);
1344 
1345                     /*
1346                      * If we were the only transaction active, treat
1347                      * the QUEUE FULL as if it were a BUSY condition.
1348                      */
1349                     if (cgds->dev_active != 0) {
1350                               int total_openings;
1351 
1352                               /*
1353                                * Reduce the number of openings to
1354                                * be 1 less than the amount it took
1355                                * to get a queue full bounded by the
1356                                * minimum allowed tag count for this
1357                                * device.
1358                                */
1359                               total_openings = cgds->dev_active + cgds->dev_openings;
1360                               *openings = cgds->dev_active;
1361                               if (*openings < cgds->mintags)
1362                                         *openings = cgds->mintags;
1363                               if (*openings < total_openings) {
1364                                         *relsim_flags = RELSIM_ADJUST_OPENINGS;
1365                               } else {
1366                                         /*
1367                                          * Some devices report queue full for
1368                                          * temporary resource shortages.  For
1369                                          * this reason, we allow a minimum
1370                                          * tag count to be entered via a
1371                                          * quirk entry to prevent the queue
1372                                          * count on these devices from falling
1373                                          * to a pessimisticly low value.  We
1374                                          * still wait for the next successful
1375                                          * completion, however, before queueing
1376                                          * more transactions to the device.
1377                                          */
1378                                         *relsim_flags = RELSIM_RELEASE_AFTER_CMDCMPLT;
1379                               }
1380                               *timeout = 0;
1381                               error = ERESTART;
1382                               if (bootverbose) {
1383                                         xpt_print(ccb->ccb_h.path, "Queue Full\n");
1384                               }
1385                               xpt_free_ccb(&cgds->ccb_h);
1386                               break;
1387                     }
1388                     xpt_free_ccb(&cgds->ccb_h);
1389                     /* FALLTHROUGH */
1390           }
1391           case SCSI_STATUS_BUSY:
1392                     /*
1393                      * Restart the queue after either another
1394                      * command completes or a 1 second timeout.
1395                      */
1396                     if (bootverbose) {
1397                               xpt_print(ccb->ccb_h.path, "Device Busy\n");
1398                     }
1399                     if (ccb->ccb_h.retry_count > 0) {
1400                               ccb->ccb_h.retry_count--;
1401                               error = ERESTART;
1402                               *relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT
1403                                               | RELSIM_RELEASE_AFTER_CMDCMPLT;
1404                               *timeout = 1000;
1405                     } else {
1406                               error = EIO;
1407                     }
1408                     break;
1409           case SCSI_STATUS_RESERV_CONFLICT:
1410                     xpt_print(ccb->ccb_h.path, "Reservation Conflict\n");
1411                     error = EIO;
1412                     break;
1413           default:
1414                     xpt_print(ccb->ccb_h.path, "SCSI Status 0x%x\n",
1415                         ccb->csio.scsi_status);
1416                     error = EIO;
1417                     break;
1418           }
1419           return (error);
1420 }
1421 
1422 static int
camperiphscsisenseerror(union ccb * ccb,cam_flags camflags,u_int32_t sense_flags,union ccb * save_ccb,int * openings,u_int32_t * relsim_flags,u_int32_t * timeout)1423 camperiphscsisenseerror(union ccb *ccb, cam_flags camflags,
1424                               u_int32_t sense_flags, union ccb *save_ccb,
1425                            int *openings, u_int32_t *relsim_flags,
1426                            u_int32_t *timeout)
1427 {
1428           struct cam_periph *periph;
1429           int error;
1430 
1431           periph = xpt_path_periph(ccb->ccb_h.path);
1432           if (periph->flags & CAM_PERIPH_RECOVERY_INPROG) {
1433 
1434                     /*
1435                      * If error recovery is already in progress, don't attempt
1436                      * to process this error, but requeue it unconditionally
1437                      * and attempt to process it once error recovery has
1438                      * completed.  This failed command is probably related to
1439                      * the error that caused the currently active error recovery
1440                      * action so our  current recovery efforts should also
1441                      * address this command.  Be aware that the error recovery
1442                      * code assumes that only one recovery action is in progress
1443                      * on a particular peripheral instance at any given time
1444                      * (e.g. only one saved CCB for error recovery) so it is
1445                      * imperitive that we don't violate this assumption.
1446                      */
1447                     error = ERESTART;
1448           } else {
1449                     scsi_sense_action err_action;
1450                     struct ccb_getdev *cgd;
1451                     const char *action_string;
1452                     union ccb* print_ccb;
1453 
1454                     /* A description of the error recovery action performed */
1455                     action_string = NULL;
1456 
1457                     /*
1458                      * The location of the orignal ccb
1459                      * for sense printing purposes.
1460                      */
1461                     print_ccb = ccb;
1462 
1463                     /*
1464                      * Grab the inquiry data for this device.
1465                      */
1466                     cgd = &xpt_alloc_ccb()->cgd;
1467                     xpt_setup_ccb(&cgd->ccb_h, ccb->ccb_h.path, /*priority*/ 1);
1468                     cgd->ccb_h.func_code = XPT_GDEV_TYPE;
1469                     xpt_action((union ccb *)cgd);
1470 
1471                     if ((ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0)
1472                               err_action = scsi_error_action(&ccb->csio,
1473                                                                    &cgd->inq_data,
1474                                                                    sense_flags);
1475                     else if ((ccb->ccb_h.flags & CAM_DIS_AUTOSENSE) == 0)
1476                               err_action = SS_REQSENSE;
1477                     else
1478                               err_action = SS_RETRY|SSQ_DECREMENT_COUNT|EIO;
1479 
1480                     error = err_action & SS_ERRMASK;
1481 
1482                     /*
1483                      * If the recovery action will consume a retry,
1484                      * make sure we actually have retries available.
1485                      */
1486                     if ((err_action & SSQ_DECREMENT_COUNT) != 0) {
1487                               if (ccb->ccb_h.retry_count > 0)
1488                                         ccb->ccb_h.retry_count--;
1489                               else {
1490                                         action_string = "Retries Exhausted";
1491                                         goto sense_error_done;
1492                               }
1493                     }
1494 
1495                     if ((err_action & SS_MASK) >= SS_START) {
1496                               /*
1497                                * Do common portions of commands that
1498                                * use recovery CCBs.
1499                                */
1500                               if (save_ccb == NULL) {
1501                                         action_string = "No recovery CCB supplied";
1502                                         goto sense_error_done;
1503                               }
1504                               bcopy(ccb, save_ccb, sizeof(*save_ccb));
1505                               print_ccb = save_ccb;
1506                               periph->flags |= CAM_PERIPH_RECOVERY_INPROG;
1507                     }
1508 
1509                     switch (err_action & SS_MASK) {
1510                     case SS_NOP:
1511                               action_string = "No Recovery Action Needed";
1512                               error = 0;
1513                               break;
1514                     case SS_RETRY:
1515                               action_string = "Retrying Command (per Sense Data)";
1516                               error = ERESTART;
1517                               break;
1518                     case SS_FAIL:
1519                               action_string = "Unretryable error";
1520                               break;
1521                     case SS_START:
1522                     {
1523                               int le;
1524 
1525                               /*
1526                                * Send a start unit command to the device, and
1527                                * then retry the command.
1528                                */
1529                               action_string = "Attempting to Start Unit";
1530 
1531                               /*
1532                                * Check for removable media and set
1533                                * load/eject flag appropriately.
1534                                */
1535                               if (SID_IS_REMOVABLE(&cgd->inq_data))
1536                                         le = TRUE;
1537                               else
1538                                         le = FALSE;
1539 
1540                               scsi_start_stop(&ccb->csio,
1541                                                   /*retries*/1,
1542                                                   camperiphdone,
1543                                                   MSG_SIMPLE_Q_TAG,
1544                                                   /*start*/TRUE,
1545                                                   /*load/eject*/le,
1546                                                   /*immediate*/FALSE,
1547                                                   SSD_FULL_SIZE,
1548                                                   /*timeout*/50000);
1549                               break;
1550                     }
1551                     case SS_TUR:
1552                     {
1553                               /*
1554                                * Send a Test Unit Ready to the device.
1555                                * If the 'many' flag is set, we send 120
1556                                * test unit ready commands, one every half
1557                                * second.  Otherwise, we just send one TUR.
1558                                * We only want to do this if the retry
1559                                * count has not been exhausted.
1560                                */
1561                               int retries;
1562 
1563                               if ((err_action & SSQ_MANY) != 0) {
1564                                         action_string = "Polling device for readiness";
1565                                         retries = 120;
1566                               } else {
1567                                         action_string = "Testing device for readiness";
1568                                         retries = 1;
1569                               }
1570                               scsi_test_unit_ready(&ccb->csio,
1571                                                        retries,
1572                                                        camperiphdone,
1573                                                        MSG_SIMPLE_Q_TAG,
1574                                                        SSD_FULL_SIZE,
1575                                                        /*timeout*/5000);
1576 
1577                               /*
1578                                * Accomplish our 500ms delay by deferring
1579                                * the release of our device queue appropriately.
1580                                */
1581                               *relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT;
1582                               *timeout = 500;
1583                               break;
1584                     }
1585                     case SS_REQSENSE:
1586                     {
1587                               /*
1588                                * Send a Request Sense to the device.  We
1589                                * assume that we are in a contingent allegiance
1590                                * condition so we do not tag this request.
1591                                */
1592                               scsi_request_sense(&ccb->csio, /*retries*/1,
1593                                                      camperiphdone,
1594                                                      &save_ccb->csio.sense_data,
1595                                                      sizeof(save_ccb->csio.sense_data),
1596                                                      CAM_TAG_ACTION_NONE,
1597                                                      /*sense_len*/SSD_FULL_SIZE,
1598                                                      /*timeout*/5000);
1599                               break;
1600                     }
1601                     default:
1602                               panic("Unhandled error action %x", err_action);
1603                     }
1604 
1605                     if ((err_action & SS_MASK) >= SS_START) {
1606                               /*
1607                                * Drop the priority to 0 so that the recovery
1608                                * CCB is the first to execute.  Freeze the queue
1609                                * after this command is sent so that we can
1610                                * restore the old csio and have it queued in
1611                                * the proper order before we release normal
1612                                * transactions to the device.
1613                                */
1614                               ccb->ccb_h.pinfo.priority = 0;
1615                               ccb->ccb_h.flags |= CAM_DEV_QFREEZE;
1616                               ccb->ccb_h.saved_ccb_ptr = save_ccb;
1617                               error = ERESTART;
1618                     }
1619 
1620 sense_error_done:
1621                     if ((err_action & SSQ_PRINT_SENSE) != 0 &&
1622                         (ccb->ccb_h.status & CAM_AUTOSNS_VALID) != 0) {
1623                               if ((ccb->ccb_h.flags & CAM_QUIET) == 0 ||
1624                                   bootverbose) {
1625                                         cam_error_print(print_ccb,
1626                                                             CAM_ESF_ALL, CAM_EPF_ALL);
1627                                         xpt_print_path(ccb->ccb_h.path);
1628                               }
1629                               if (bootverbose)
1630                                         scsi_sense_print(&print_ccb->csio);
1631                               if ((ccb->ccb_h.flags & CAM_QUIET) == 0 ||
1632                                   bootverbose) {
1633                                         kprintf("%s\n", action_string);
1634                               }
1635                     }
1636                     xpt_free_ccb(&cgd->ccb_h);
1637           }
1638           return (error);
1639 }
1640 
1641 /*
1642  * Generic error handler.  Peripheral drivers usually filter
1643  * out the errors that they handle in a unique mannor, then
1644  * call this function.
1645  */
1646 int
cam_periph_error(union ccb * ccb,cam_flags camflags,u_int32_t sense_flags,union ccb * save_ccb)1647 cam_periph_error(union ccb *ccb, cam_flags camflags,
1648                      u_int32_t sense_flags, union ccb *save_ccb)
1649 {
1650           const char *action_string;
1651           cam_status  status;
1652           int           frozen;
1653           int           error, printed = 0;
1654           int         openings;
1655           u_int32_t   relsim_flags;
1656           u_int32_t   timeout = 0;
1657 
1658           action_string = NULL;
1659           status = ccb->ccb_h.status;
1660           frozen = (status & CAM_DEV_QFRZN) != 0;
1661           status &= CAM_STATUS_MASK;
1662           openings = relsim_flags = 0;
1663 
1664           switch (status) {
1665           case CAM_REQ_CMP:
1666                     error = 0;
1667                     break;
1668           case CAM_SCSI_STATUS_ERROR:
1669                     error = camperiphscsistatuserror(ccb,
1670                                                              camflags,
1671                                                              sense_flags,
1672                                                              save_ccb,
1673                                                              &openings,
1674                                                              &relsim_flags,
1675                                                              &timeout);
1676                     break;
1677           case CAM_AUTOSENSE_FAIL:
1678                     xpt_print(ccb->ccb_h.path, "AutoSense Failed\n");
1679                     error = EIO;        /* we have to kill the command */
1680                     break;
1681           case CAM_REQ_CMP_ERR:
1682                     if (bootverbose && printed == 0) {
1683                               xpt_print(ccb->ccb_h.path,
1684                                   "Request completed with CAM_REQ_CMP_ERR\n");
1685                               printed++;
1686                     }
1687                     /* FALLTHROUGH */
1688           case CAM_CMD_TIMEOUT:
1689                     if (bootverbose && printed == 0) {
1690                               xpt_print(ccb->ccb_h.path, "Command timed out\n");
1691                               printed++;
1692                     }
1693                     /* FALLTHROUGH */
1694           case CAM_UNEXP_BUSFREE:
1695                     if (bootverbose && printed == 0) {
1696                               xpt_print(ccb->ccb_h.path, "Unexpected Bus Free\n");
1697                               printed++;
1698                     }
1699                     /* FALLTHROUGH */
1700           case CAM_UNCOR_PARITY:
1701                     if (bootverbose && printed == 0) {
1702                               xpt_print(ccb->ccb_h.path,
1703                                   "Uncorrected Parity Error\n");
1704                               printed++;
1705                     }
1706                     /* FALLTHROUGH */
1707           case CAM_DATA_RUN_ERR:
1708                     if (bootverbose && printed == 0) {
1709                               xpt_print(ccb->ccb_h.path, "Data Overrun\n");
1710                               printed++;
1711                     }
1712                     error = EIO;        /* we have to kill the command */
1713                     /* decrement the number of retries */
1714                     if (ccb->ccb_h.retry_count > 0) {
1715                               ccb->ccb_h.retry_count--;
1716                               error = ERESTART;
1717                     } else {
1718                               action_string = "Retries Exhausted";
1719                               error = EIO;
1720                     }
1721                     break;
1722           case CAM_UA_ABORT:
1723           case CAM_UA_TERMIO:
1724           case CAM_MSG_REJECT_REC:
1725                     /* XXX Don't know that these are correct */
1726                     error = EIO;
1727                     break;
1728           case CAM_SEL_TIMEOUT:
1729           {
1730                     struct cam_path *newpath;
1731 
1732                     if ((camflags & CAM_RETRY_SELTO) != 0) {
1733                               if (ccb->ccb_h.retry_count > 0) {
1734 
1735                                         ccb->ccb_h.retry_count--;
1736                                         error = ERESTART;
1737                                         if (bootverbose && printed == 0) {
1738                                                   xpt_print(ccb->ccb_h.path,
1739                                                       "Selection Timeout\n");
1740                                                   printed++;
1741                                         }
1742 
1743                                         /*
1744                                          * Wait a bit to give the device
1745                                          * time to recover before we try again.
1746                                          */
1747                                         relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT;
1748                                         timeout = periph_selto_delay;
1749                                         break;
1750                               }
1751                     }
1752                     error = ENXIO;
1753                     /* Should we do more if we can't create the path?? */
1754                     if (xpt_create_path(&newpath, xpt_path_periph(ccb->ccb_h.path),
1755                                             xpt_path_path_id(ccb->ccb_h.path),
1756                                             xpt_path_target_id(ccb->ccb_h.path),
1757                                             CAM_LUN_WILDCARD) != CAM_REQ_CMP)
1758                               break;
1759 
1760                     /*
1761                      * Let peripheral drivers know that this device has gone
1762                      * away.
1763                      */
1764                     xpt_async(AC_LOST_DEVICE, newpath, NULL);
1765                     xpt_free_path(newpath);
1766                     break;
1767           }
1768           case CAM_REQ_INVALID:
1769           case CAM_PATH_INVALID:
1770           case CAM_DEV_NOT_THERE:
1771           case CAM_NO_HBA:
1772           case CAM_PROVIDE_FAIL:
1773           case CAM_REQ_TOO_BIG:
1774           case CAM_LUN_INVALID:
1775           case CAM_TID_INVALID:
1776                     error = EINVAL;
1777                     break;
1778           case CAM_SCSI_BUS_RESET:
1779           case CAM_BDR_SENT:
1780                     /*
1781                      * Commands that repeatedly timeout and cause these
1782                      * kinds of error recovery actions, should return
1783                      * CAM_CMD_TIMEOUT, which allows us to safely assume
1784                      * that this command was an innocent bystander to
1785                      * these events and should be unconditionally
1786                      * retried.
1787                      */
1788                     if (bootverbose && printed == 0) {
1789                               xpt_print_path(ccb->ccb_h.path);
1790                               if (status == CAM_BDR_SENT)
1791                                         kprintf("Bus Device Reset sent\n");
1792                               else
1793                                         kprintf("Bus Reset issued\n");
1794                               printed++;
1795                     }
1796                     /* FALLTHROUGH */
1797           case CAM_REQUEUE_REQ:
1798                     /* Unconditional requeue */
1799                     error = ERESTART;
1800                     if (bootverbose && printed == 0) {
1801                               xpt_print(ccb->ccb_h.path, "Request Requeued\n");
1802                               printed++;
1803                     }
1804                     break;
1805           case CAM_RESRC_UNAVAIL:
1806                     /* Wait a bit for the resource shortage to abate. */
1807                     timeout = periph_noresrc_delay;
1808                     /* FALLTHROUGH */
1809           case CAM_BUSY:
1810                     if (timeout == 0) {
1811                               /* Wait a bit for the busy condition to abate. */
1812                               timeout = periph_busy_delay;
1813                     }
1814                     relsim_flags = RELSIM_RELEASE_AFTER_TIMEOUT;
1815                     /* FALLTHROUGH */
1816           default:
1817                     /* decrement the number of retries */
1818                     if (ccb->ccb_h.retry_count > 0) {
1819                               ccb->ccb_h.retry_count--;
1820                               error = ERESTART;
1821                               if (bootverbose && printed == 0) {
1822                                         xpt_print(ccb->ccb_h.path, "CAM Status 0x%x\n",
1823                                             status);
1824                                         printed++;
1825                               }
1826                     } else {
1827                               error = EIO;
1828                               action_string = "Retries Exhausted";
1829                     }
1830                     break;
1831           }
1832 
1833           /* Attempt a retry */
1834           if (error == ERESTART || error == 0) {
1835                     if (frozen != 0)
1836                               ccb->ccb_h.status &= ~CAM_DEV_QFRZN;
1837 
1838                     if (error == ERESTART) {
1839                               action_string = "Retrying Command";
1840                               xpt_action(ccb);
1841                     }
1842 
1843                     if (frozen != 0)
1844                               cam_release_devq(ccb->ccb_h.path,
1845                                                    relsim_flags,
1846                                                    openings,
1847                                                    timeout,
1848                                                    /*getcount_only*/0);
1849           }
1850 
1851           /*
1852            * If we have an error and are booting verbosely, whine
1853            * *unless* this was a non-retryable selection timeout.
1854            */
1855           if (error != 0 && bootverbose && (sense_flags & SF_NO_PRINT) == 0 &&
1856               !(status == CAM_SEL_TIMEOUT && (camflags & CAM_RETRY_SELTO) == 0)) {
1857 
1858 
1859                     if (action_string == NULL)
1860                               action_string = "Unretryable Error";
1861                     if (error != ERESTART) {
1862                               xpt_print(ccb->ccb_h.path, "error %d\n", error);
1863                     }
1864                     xpt_print(ccb->ccb_h.path, "%s\n", action_string);
1865           }
1866 
1867           return (error);
1868 }
1869