1 /* 2 * Parallel SCSI (SPI) transport specific attributes exported to sysfs. 3 * 4 * Copyright (c) 2003 Silicon Graphics, Inc. All rights reserved. 5 * Copyright (c) 2004, 2005 James Bottomley <James.Bottomley@SteelEye.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 #include <linux/ctype.h> 22 #include <linux/init.h> 23 #include <linux/module.h> 24 #include <linux/workqueue.h> 25 #include <linux/blkdev.h> 26 #include <linux/mutex.h> 27 #include <linux/sysfs.h> 28 #include <linux/slab.h> 29 #include <scsi/scsi.h> 30 #include "scsi_priv.h" 31 #include <scsi/scsi_device.h> 32 #include <scsi/scsi_host.h> 33 #include <scsi/scsi_cmnd.h> 34 #include <scsi/scsi_eh.h> 35 #include <scsi/scsi_tcq.h> 36 #include <scsi/scsi_transport.h> 37 #include <scsi/scsi_transport_spi.h> 38 39 #define SPI_NUM_ATTRS 14 /* increase this if you add attributes */ 40 #define SPI_OTHER_ATTRS 1 /* Increase this if you add "always 41 * on" attributes */ 42 #define SPI_HOST_ATTRS 1 43 44 #define SPI_MAX_ECHO_BUFFER_SIZE 4096 45 46 #define DV_LOOPS 3 47 #define DV_TIMEOUT (10*HZ) 48 #define DV_RETRIES 3 /* should only need at most 49 * two cc/ua clears */ 50 51 /* Our blacklist flags */ 52 enum { 53 SPI_BLIST_NOIUS = 0x1, 54 }; 55 56 /* blacklist table, modelled on scsi_devinfo.c */ 57 static struct { 58 char *vendor; 59 char *model; 60 unsigned flags; 61 } spi_static_device_list[] __initdata = { 62 {"HP", "Ultrium 3-SCSI", SPI_BLIST_NOIUS }, 63 {"IBM", "ULTRIUM-TD3", SPI_BLIST_NOIUS }, 64 {NULL, NULL, 0} 65 }; 66 67 /* Private data accessors (keep these out of the header file) */ 68 #define spi_dv_in_progress(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_in_progress) 69 #define spi_dv_mutex(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_mutex) 70 71 struct spi_internal { 72 struct scsi_transport_template t; 73 struct spi_function_template *f; 74 }; 75 76 #define to_spi_internal(tmpl) container_of(tmpl, struct spi_internal, t) 77 78 static const int ppr_to_ps[] = { 79 /* The PPR values 0-6 are reserved, fill them in when 80 * the committee defines them */ 81 -1, /* 0x00 */ 82 -1, /* 0x01 */ 83 -1, /* 0x02 */ 84 -1, /* 0x03 */ 85 -1, /* 0x04 */ 86 -1, /* 0x05 */ 87 -1, /* 0x06 */ 88 3125, /* 0x07 */ 89 6250, /* 0x08 */ 90 12500, /* 0x09 */ 91 25000, /* 0x0a */ 92 30300, /* 0x0b */ 93 50000, /* 0x0c */ 94 }; 95 /* The PPR values at which you calculate the period in ns by multiplying 96 * by 4 */ 97 #define SPI_STATIC_PPR 0x0c 98 99 static int sprint_frac(char *dest, int value, int denom) 100 { 101 int frac = value % denom; 102 int result = sprintf(dest, "%d", value / denom); 103 104 if (frac == 0) 105 return result; 106 dest[result++] = '.'; 107 108 do { 109 denom /= 10; 110 sprintf(dest + result, "%d", frac / denom); 111 result++; 112 frac %= denom; 113 } while (frac); 114 115 dest[result++] = '\0'; 116 return result; 117 } 118 119 static int spi_execute(struct scsi_device *sdev, const void *cmd, 120 enum dma_data_direction dir, 121 void *buffer, unsigned bufflen, 122 struct scsi_sense_hdr *sshdr) 123 { 124 int i, result; 125 unsigned char sense[SCSI_SENSE_BUFFERSIZE]; 126 127 for(i = 0; i < DV_RETRIES; i++) { 128 result = scsi_execute(sdev, cmd, dir, buffer, bufflen, 129 sense, DV_TIMEOUT, /* retries */ 1, 130 REQ_FAILFAST_DEV | 131 REQ_FAILFAST_TRANSPORT | 132 REQ_FAILFAST_DRIVER, 133 NULL); 134 if (driver_byte(result) & DRIVER_SENSE) { 135 struct scsi_sense_hdr sshdr_tmp; 136 if (!sshdr) 137 sshdr = &sshdr_tmp; 138 139 if (scsi_normalize_sense(sense, SCSI_SENSE_BUFFERSIZE, 140 sshdr) 141 && sshdr->sense_key == UNIT_ATTENTION) 142 continue; 143 } 144 break; 145 } 146 return result; 147 } 148 149 static struct { 150 enum spi_signal_type value; 151 char *name; 152 } signal_types[] = { 153 { SPI_SIGNAL_UNKNOWN, "unknown" }, 154 { SPI_SIGNAL_SE, "SE" }, 155 { SPI_SIGNAL_LVD, "LVD" }, 156 { SPI_SIGNAL_HVD, "HVD" }, 157 }; 158 159 static inline const char *spi_signal_to_string(enum spi_signal_type type) 160 { 161 int i; 162 163 for (i = 0; i < ARRAY_SIZE(signal_types); i++) { 164 if (type == signal_types[i].value) 165 return signal_types[i].name; 166 } 167 return NULL; 168 } 169 static inline enum spi_signal_type spi_signal_to_value(const char *name) 170 { 171 int i, len; 172 173 for (i = 0; i < ARRAY_SIZE(signal_types); i++) { 174 len = strlen(signal_types[i].name); 175 if (strncmp(name, signal_types[i].name, len) == 0 && 176 (name[len] == '\n' || name[len] == '\0')) 177 return signal_types[i].value; 178 } 179 return SPI_SIGNAL_UNKNOWN; 180 } 181 182 static int spi_host_setup(struct transport_container *tc, struct device *dev, 183 struct device *cdev) 184 { 185 struct Scsi_Host *shost = dev_to_shost(dev); 186 187 spi_signalling(shost) = SPI_SIGNAL_UNKNOWN; 188 189 return 0; 190 } 191 192 static int spi_host_configure(struct transport_container *tc, 193 struct device *dev, 194 struct device *cdev); 195 196 static DECLARE_TRANSPORT_CLASS(spi_host_class, 197 "spi_host", 198 spi_host_setup, 199 NULL, 200 spi_host_configure); 201 202 static int spi_host_match(struct attribute_container *cont, 203 struct device *dev) 204 { 205 struct Scsi_Host *shost; 206 207 if (!scsi_is_host_device(dev)) 208 return 0; 209 210 shost = dev_to_shost(dev); 211 if (!shost->transportt || shost->transportt->host_attrs.ac.class 212 != &spi_host_class.class) 213 return 0; 214 215 return &shost->transportt->host_attrs.ac == cont; 216 } 217 218 static int spi_target_configure(struct transport_container *tc, 219 struct device *dev, 220 struct device *cdev); 221 222 static int spi_device_configure(struct transport_container *tc, 223 struct device *dev, 224 struct device *cdev) 225 { 226 struct scsi_device *sdev = to_scsi_device(dev); 227 struct scsi_target *starget = sdev->sdev_target; 228 unsigned bflags = scsi_get_device_flags_keyed(sdev, &sdev->inquiry[8], 229 &sdev->inquiry[16], 230 SCSI_DEVINFO_SPI); 231 232 /* Populate the target capability fields with the values 233 * gleaned from the device inquiry */ 234 235 spi_support_sync(starget) = scsi_device_sync(sdev); 236 spi_support_wide(starget) = scsi_device_wide(sdev); 237 spi_support_dt(starget) = scsi_device_dt(sdev); 238 spi_support_dt_only(starget) = scsi_device_dt_only(sdev); 239 spi_support_ius(starget) = scsi_device_ius(sdev); 240 if (bflags & SPI_BLIST_NOIUS) { 241 dev_info(dev, "Information Units disabled by blacklist\n"); 242 spi_support_ius(starget) = 0; 243 } 244 spi_support_qas(starget) = scsi_device_qas(sdev); 245 246 return 0; 247 } 248 249 static int spi_setup_transport_attrs(struct transport_container *tc, 250 struct device *dev, 251 struct device *cdev) 252 { 253 struct scsi_target *starget = to_scsi_target(dev); 254 255 spi_period(starget) = -1; /* illegal value */ 256 spi_min_period(starget) = 0; 257 spi_offset(starget) = 0; /* async */ 258 spi_max_offset(starget) = 255; 259 spi_width(starget) = 0; /* narrow */ 260 spi_max_width(starget) = 1; 261 spi_iu(starget) = 0; /* no IU */ 262 spi_max_iu(starget) = 1; 263 spi_dt(starget) = 0; /* ST */ 264 spi_qas(starget) = 0; 265 spi_max_qas(starget) = 1; 266 spi_wr_flow(starget) = 0; 267 spi_rd_strm(starget) = 0; 268 spi_rti(starget) = 0; 269 spi_pcomp_en(starget) = 0; 270 spi_hold_mcs(starget) = 0; 271 spi_dv_pending(starget) = 0; 272 spi_dv_in_progress(starget) = 0; 273 spi_initial_dv(starget) = 0; 274 mutex_init(&spi_dv_mutex(starget)); 275 276 return 0; 277 } 278 279 #define spi_transport_show_simple(field, format_string) \ 280 \ 281 static ssize_t \ 282 show_spi_transport_##field(struct device *dev, \ 283 struct device_attribute *attr, char *buf) \ 284 { \ 285 struct scsi_target *starget = transport_class_to_starget(dev); \ 286 struct spi_transport_attrs *tp; \ 287 \ 288 tp = (struct spi_transport_attrs *)&starget->starget_data; \ 289 return snprintf(buf, 20, format_string, tp->field); \ 290 } 291 292 #define spi_transport_store_simple(field, format_string) \ 293 \ 294 static ssize_t \ 295 store_spi_transport_##field(struct device *dev, \ 296 struct device_attribute *attr, \ 297 const char *buf, size_t count) \ 298 { \ 299 int val; \ 300 struct scsi_target *starget = transport_class_to_starget(dev); \ 301 struct spi_transport_attrs *tp; \ 302 \ 303 tp = (struct spi_transport_attrs *)&starget->starget_data; \ 304 val = simple_strtoul(buf, NULL, 0); \ 305 tp->field = val; \ 306 return count; \ 307 } 308 309 #define spi_transport_show_function(field, format_string) \ 310 \ 311 static ssize_t \ 312 show_spi_transport_##field(struct device *dev, \ 313 struct device_attribute *attr, char *buf) \ 314 { \ 315 struct scsi_target *starget = transport_class_to_starget(dev); \ 316 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); \ 317 struct spi_transport_attrs *tp; \ 318 struct spi_internal *i = to_spi_internal(shost->transportt); \ 319 tp = (struct spi_transport_attrs *)&starget->starget_data; \ 320 if (i->f->get_##field) \ 321 i->f->get_##field(starget); \ 322 return snprintf(buf, 20, format_string, tp->field); \ 323 } 324 325 #define spi_transport_store_function(field, format_string) \ 326 static ssize_t \ 327 store_spi_transport_##field(struct device *dev, \ 328 struct device_attribute *attr, \ 329 const char *buf, size_t count) \ 330 { \ 331 int val; \ 332 struct scsi_target *starget = transport_class_to_starget(dev); \ 333 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); \ 334 struct spi_internal *i = to_spi_internal(shost->transportt); \ 335 \ 336 if (!i->f->set_##field) \ 337 return -EINVAL; \ 338 val = simple_strtoul(buf, NULL, 0); \ 339 i->f->set_##field(starget, val); \ 340 return count; \ 341 } 342 343 #define spi_transport_store_max(field, format_string) \ 344 static ssize_t \ 345 store_spi_transport_##field(struct device *dev, \ 346 struct device_attribute *attr, \ 347 const char *buf, size_t count) \ 348 { \ 349 int val; \ 350 struct scsi_target *starget = transport_class_to_starget(dev); \ 351 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); \ 352 struct spi_internal *i = to_spi_internal(shost->transportt); \ 353 struct spi_transport_attrs *tp \ 354 = (struct spi_transport_attrs *)&starget->starget_data; \ 355 \ 356 if (i->f->set_##field) \ 357 return -EINVAL; \ 358 val = simple_strtoul(buf, NULL, 0); \ 359 if (val > tp->max_##field) \ 360 val = tp->max_##field; \ 361 i->f->set_##field(starget, val); \ 362 return count; \ 363 } 364 365 #define spi_transport_rd_attr(field, format_string) \ 366 spi_transport_show_function(field, format_string) \ 367 spi_transport_store_function(field, format_string) \ 368 static DEVICE_ATTR(field, S_IRUGO, \ 369 show_spi_transport_##field, \ 370 store_spi_transport_##field); 371 372 #define spi_transport_simple_attr(field, format_string) \ 373 spi_transport_show_simple(field, format_string) \ 374 spi_transport_store_simple(field, format_string) \ 375 static DEVICE_ATTR(field, S_IRUGO, \ 376 show_spi_transport_##field, \ 377 store_spi_transport_##field); 378 379 #define spi_transport_max_attr(field, format_string) \ 380 spi_transport_show_function(field, format_string) \ 381 spi_transport_store_max(field, format_string) \ 382 spi_transport_simple_attr(max_##field, format_string) \ 383 static DEVICE_ATTR(field, S_IRUGO, \ 384 show_spi_transport_##field, \ 385 store_spi_transport_##field); 386 387 /* The Parallel SCSI Tranport Attributes: */ 388 spi_transport_max_attr(offset, "%d\n"); 389 spi_transport_max_attr(width, "%d\n"); 390 spi_transport_max_attr(iu, "%d\n"); 391 spi_transport_rd_attr(dt, "%d\n"); 392 spi_transport_max_attr(qas, "%d\n"); 393 spi_transport_rd_attr(wr_flow, "%d\n"); 394 spi_transport_rd_attr(rd_strm, "%d\n"); 395 spi_transport_rd_attr(rti, "%d\n"); 396 spi_transport_rd_attr(pcomp_en, "%d\n"); 397 spi_transport_rd_attr(hold_mcs, "%d\n"); 398 399 /* we only care about the first child device that's a real SCSI device 400 * so we return 1 to terminate the iteration when we find it */ 401 static int child_iter(struct device *dev, void *data) 402 { 403 if (!scsi_is_sdev_device(dev)) 404 return 0; 405 406 spi_dv_device(to_scsi_device(dev)); 407 return 1; 408 } 409 410 static ssize_t 411 store_spi_revalidate(struct device *dev, struct device_attribute *attr, 412 const char *buf, size_t count) 413 { 414 struct scsi_target *starget = transport_class_to_starget(dev); 415 416 device_for_each_child(&starget->dev, NULL, child_iter); 417 return count; 418 } 419 static DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate); 420 421 /* Translate the period into ns according to the current spec 422 * for SDTR/PPR messages */ 423 static int period_to_str(char *buf, int period) 424 { 425 int len, picosec; 426 427 if (period < 0 || period > 0xff) { 428 picosec = -1; 429 } else if (period <= SPI_STATIC_PPR) { 430 picosec = ppr_to_ps[period]; 431 } else { 432 picosec = period * 4000; 433 } 434 435 if (picosec == -1) { 436 len = sprintf(buf, "reserved"); 437 } else { 438 len = sprint_frac(buf, picosec, 1000); 439 } 440 441 return len; 442 } 443 444 static ssize_t 445 show_spi_transport_period_helper(char *buf, int period) 446 { 447 int len = period_to_str(buf, period); 448 buf[len++] = '\n'; 449 buf[len] = '\0'; 450 return len; 451 } 452 453 static ssize_t 454 store_spi_transport_period_helper(struct device *dev, const char *buf, 455 size_t count, int *periodp) 456 { 457 int j, picosec, period = -1; 458 char *endp; 459 460 picosec = simple_strtoul(buf, &endp, 10) * 1000; 461 if (*endp == '.') { 462 int mult = 100; 463 do { 464 endp++; 465 if (!isdigit(*endp)) 466 break; 467 picosec += (*endp - '0') * mult; 468 mult /= 10; 469 } while (mult > 0); 470 } 471 472 for (j = 0; j <= SPI_STATIC_PPR; j++) { 473 if (ppr_to_ps[j] < picosec) 474 continue; 475 period = j; 476 break; 477 } 478 479 if (period == -1) 480 period = picosec / 4000; 481 482 if (period > 0xff) 483 period = 0xff; 484 485 *periodp = period; 486 487 return count; 488 } 489 490 static ssize_t 491 show_spi_transport_period(struct device *dev, 492 struct device_attribute *attr, char *buf) 493 { 494 struct scsi_target *starget = transport_class_to_starget(dev); 495 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); 496 struct spi_internal *i = to_spi_internal(shost->transportt); 497 struct spi_transport_attrs *tp = 498 (struct spi_transport_attrs *)&starget->starget_data; 499 500 if (i->f->get_period) 501 i->f->get_period(starget); 502 503 return show_spi_transport_period_helper(buf, tp->period); 504 } 505 506 static ssize_t 507 store_spi_transport_period(struct device *cdev, struct device_attribute *attr, 508 const char *buf, size_t count) 509 { 510 struct scsi_target *starget = transport_class_to_starget(cdev); 511 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); 512 struct spi_internal *i = to_spi_internal(shost->transportt); 513 struct spi_transport_attrs *tp = 514 (struct spi_transport_attrs *)&starget->starget_data; 515 int period, retval; 516 517 if (!i->f->set_period) 518 return -EINVAL; 519 520 retval = store_spi_transport_period_helper(cdev, buf, count, &period); 521 522 if (period < tp->min_period) 523 period = tp->min_period; 524 525 i->f->set_period(starget, period); 526 527 return retval; 528 } 529 530 static DEVICE_ATTR(period, S_IRUGO, 531 show_spi_transport_period, 532 store_spi_transport_period); 533 534 static ssize_t 535 show_spi_transport_min_period(struct device *cdev, 536 struct device_attribute *attr, char *buf) 537 { 538 struct scsi_target *starget = transport_class_to_starget(cdev); 539 struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); 540 struct spi_internal *i = to_spi_internal(shost->transportt); 541 struct spi_transport_attrs *tp = 542 (struct spi_transport_attrs *)&starget->starget_data; 543 544 if (!i->f->set_period) 545 return -EINVAL; 546 547 return show_spi_transport_period_helper(buf, tp->min_period); 548 } 549 550 static ssize_t 551 store_spi_transport_min_period(struct device *cdev, 552 struct device_attribute *attr, 553 const char *buf, size_t count) 554 { 555 struct scsi_target *starget = transport_class_to_starget(cdev); 556 struct spi_transport_attrs *tp = 557 (struct spi_transport_attrs *)&starget->starget_data; 558 559 return store_spi_transport_period_helper(cdev, buf, count, 560 &tp->min_period); 561 } 562 563 564 static DEVICE_ATTR(min_period, S_IRUGO, 565 show_spi_transport_min_period, 566 store_spi_transport_min_period); 567 568 569 static ssize_t show_spi_host_signalling(struct device *cdev, 570 struct device_attribute *attr, 571 char *buf) 572 { 573 struct Scsi_Host *shost = transport_class_to_shost(cdev); 574 struct spi_internal *i = to_spi_internal(shost->transportt); 575 576 if (i->f->get_signalling) 577 i->f->get_signalling(shost); 578 579 return sprintf(buf, "%s\n", spi_signal_to_string(spi_signalling(shost))); 580 } 581 static ssize_t store_spi_host_signalling(struct device *dev, 582 struct device_attribute *attr, 583 const char *buf, size_t count) 584 { 585 struct Scsi_Host *shost = transport_class_to_shost(dev); 586 struct spi_internal *i = to_spi_internal(shost->transportt); 587 enum spi_signal_type type = spi_signal_to_value(buf); 588 589 if (!i->f->set_signalling) 590 return -EINVAL; 591 592 if (type != SPI_SIGNAL_UNKNOWN) 593 i->f->set_signalling(shost, type); 594 595 return count; 596 } 597 static DEVICE_ATTR(signalling, S_IRUGO, 598 show_spi_host_signalling, 599 store_spi_host_signalling); 600 601 static ssize_t show_spi_host_width(struct device *cdev, 602 struct device_attribute *attr, 603 char *buf) 604 { 605 struct Scsi_Host *shost = transport_class_to_shost(cdev); 606 607 return sprintf(buf, "%s\n", shost->max_id == 16 ? "wide" : "narrow"); 608 } 609 static DEVICE_ATTR(host_width, S_IRUGO, 610 show_spi_host_width, NULL); 611 612 static ssize_t show_spi_host_hba_id(struct device *cdev, 613 struct device_attribute *attr, 614 char *buf) 615 { 616 struct Scsi_Host *shost = transport_class_to_shost(cdev); 617 618 return sprintf(buf, "%d\n", shost->this_id); 619 } 620 static DEVICE_ATTR(hba_id, S_IRUGO, 621 show_spi_host_hba_id, NULL); 622 623 #define DV_SET(x, y) \ 624 if(i->f->set_##x) \ 625 i->f->set_##x(sdev->sdev_target, y) 626 627 enum spi_compare_returns { 628 SPI_COMPARE_SUCCESS, 629 SPI_COMPARE_FAILURE, 630 SPI_COMPARE_SKIP_TEST, 631 }; 632 633 634 /* This is for read/write Domain Validation: If the device supports 635 * an echo buffer, we do read/write tests to it */ 636 static enum spi_compare_returns 637 spi_dv_device_echo_buffer(struct scsi_device *sdev, u8 *buffer, 638 u8 *ptr, const int retries) 639 { 640 int len = ptr - buffer; 641 int j, k, r, result; 642 unsigned int pattern = 0x0000ffff; 643 struct scsi_sense_hdr sshdr; 644 645 const char spi_write_buffer[] = { 646 WRITE_BUFFER, 0x0a, 0, 0, 0, 0, 0, len >> 8, len & 0xff, 0 647 }; 648 const char spi_read_buffer[] = { 649 READ_BUFFER, 0x0a, 0, 0, 0, 0, 0, len >> 8, len & 0xff, 0 650 }; 651 652 /* set up the pattern buffer. Doesn't matter if we spill 653 * slightly beyond since that's where the read buffer is */ 654 for (j = 0; j < len; ) { 655 656 /* fill the buffer with counting (test a) */ 657 for ( ; j < min(len, 32); j++) 658 buffer[j] = j; 659 k = j; 660 /* fill the buffer with alternating words of 0x0 and 661 * 0xffff (test b) */ 662 for ( ; j < min(len, k + 32); j += 2) { 663 u16 *word = (u16 *)&buffer[j]; 664 665 *word = (j & 0x02) ? 0x0000 : 0xffff; 666 } 667 k = j; 668 /* fill with crosstalk (alternating 0x5555 0xaaa) 669 * (test c) */ 670 for ( ; j < min(len, k + 32); j += 2) { 671 u16 *word = (u16 *)&buffer[j]; 672 673 *word = (j & 0x02) ? 0x5555 : 0xaaaa; 674 } 675 k = j; 676 /* fill with shifting bits (test d) */ 677 for ( ; j < min(len, k + 32); j += 4) { 678 u32 *word = (unsigned int *)&buffer[j]; 679 u32 roll = (pattern & 0x80000000) ? 1 : 0; 680 681 *word = pattern; 682 pattern = (pattern << 1) | roll; 683 } 684 /* don't bother with random data (test e) */ 685 } 686 687 for (r = 0; r < retries; r++) { 688 result = spi_execute(sdev, spi_write_buffer, DMA_TO_DEVICE, 689 buffer, len, &sshdr); 690 if(result || !scsi_device_online(sdev)) { 691 692 scsi_device_set_state(sdev, SDEV_QUIESCE); 693 if (scsi_sense_valid(&sshdr) 694 && sshdr.sense_key == ILLEGAL_REQUEST 695 /* INVALID FIELD IN CDB */ 696 && sshdr.asc == 0x24 && sshdr.ascq == 0x00) 697 /* This would mean that the drive lied 698 * to us about supporting an echo 699 * buffer (unfortunately some Western 700 * Digital drives do precisely this) 701 */ 702 return SPI_COMPARE_SKIP_TEST; 703 704 705 sdev_printk(KERN_ERR, sdev, "Write Buffer failure %x\n", result); 706 return SPI_COMPARE_FAILURE; 707 } 708 709 memset(ptr, 0, len); 710 spi_execute(sdev, spi_read_buffer, DMA_FROM_DEVICE, 711 ptr, len, NULL); 712 scsi_device_set_state(sdev, SDEV_QUIESCE); 713 714 if (memcmp(buffer, ptr, len) != 0) 715 return SPI_COMPARE_FAILURE; 716 } 717 return SPI_COMPARE_SUCCESS; 718 } 719 720 /* This is for the simplest form of Domain Validation: a read test 721 * on the inquiry data from the device */ 722 static enum spi_compare_returns 723 spi_dv_device_compare_inquiry(struct scsi_device *sdev, u8 *buffer, 724 u8 *ptr, const int retries) 725 { 726 int r, result; 727 const int len = sdev->inquiry_len; 728 const char spi_inquiry[] = { 729 INQUIRY, 0, 0, 0, len, 0 730 }; 731 732 for (r = 0; r < retries; r++) { 733 memset(ptr, 0, len); 734 735 result = spi_execute(sdev, spi_inquiry, DMA_FROM_DEVICE, 736 ptr, len, NULL); 737 738 if(result || !scsi_device_online(sdev)) { 739 scsi_device_set_state(sdev, SDEV_QUIESCE); 740 return SPI_COMPARE_FAILURE; 741 } 742 743 /* If we don't have the inquiry data already, the 744 * first read gets it */ 745 if (ptr == buffer) { 746 ptr += len; 747 --r; 748 continue; 749 } 750 751 if (memcmp(buffer, ptr, len) != 0) 752 /* failure */ 753 return SPI_COMPARE_FAILURE; 754 } 755 return SPI_COMPARE_SUCCESS; 756 } 757 758 static enum spi_compare_returns 759 spi_dv_retrain(struct scsi_device *sdev, u8 *buffer, u8 *ptr, 760 enum spi_compare_returns 761 (*compare_fn)(struct scsi_device *, u8 *, u8 *, int)) 762 { 763 struct spi_internal *i = to_spi_internal(sdev->host->transportt); 764 struct scsi_target *starget = sdev->sdev_target; 765 int period = 0, prevperiod = 0; 766 enum spi_compare_returns retval; 767 768 769 for (;;) { 770 int newperiod; 771 retval = compare_fn(sdev, buffer, ptr, DV_LOOPS); 772 773 if (retval == SPI_COMPARE_SUCCESS 774 || retval == SPI_COMPARE_SKIP_TEST) 775 break; 776 777 /* OK, retrain, fallback */ 778 if (i->f->get_iu) 779 i->f->get_iu(starget); 780 if (i->f->get_qas) 781 i->f->get_qas(starget); 782 if (i->f->get_period) 783 i->f->get_period(sdev->sdev_target); 784 785 /* Here's the fallback sequence; first try turning off 786 * IU, then QAS (if we can control them), then finally 787 * fall down the periods */ 788 if (i->f->set_iu && spi_iu(starget)) { 789 starget_printk(KERN_ERR, starget, "Domain Validation Disabing Information Units\n"); 790 DV_SET(iu, 0); 791 } else if (i->f->set_qas && spi_qas(starget)) { 792 starget_printk(KERN_ERR, starget, "Domain Validation Disabing Quick Arbitration and Selection\n"); 793 DV_SET(qas, 0); 794 } else { 795 newperiod = spi_period(starget); 796 period = newperiod > period ? newperiod : period; 797 if (period < 0x0d) 798 period++; 799 else 800 period += period >> 1; 801 802 if (unlikely(period > 0xff || period == prevperiod)) { 803 /* Total failure; set to async and return */ 804 starget_printk(KERN_ERR, starget, "Domain Validation Failure, dropping back to Asynchronous\n"); 805 DV_SET(offset, 0); 806 return SPI_COMPARE_FAILURE; 807 } 808 starget_printk(KERN_ERR, starget, "Domain Validation detected failure, dropping back\n"); 809 DV_SET(period, period); 810 prevperiod = period; 811 } 812 } 813 return retval; 814 } 815 816 static int 817 spi_dv_device_get_echo_buffer(struct scsi_device *sdev, u8 *buffer) 818 { 819 int l, result; 820 821 /* first off do a test unit ready. This can error out 822 * because of reservations or some other reason. If it 823 * fails, the device won't let us write to the echo buffer 824 * so just return failure */ 825 826 const char spi_test_unit_ready[] = { 827 TEST_UNIT_READY, 0, 0, 0, 0, 0 828 }; 829 830 const char spi_read_buffer_descriptor[] = { 831 READ_BUFFER, 0x0b, 0, 0, 0, 0, 0, 0, 4, 0 832 }; 833 834 835 /* We send a set of three TURs to clear any outstanding 836 * unit attention conditions if they exist (Otherwise the 837 * buffer tests won't be happy). If the TUR still fails 838 * (reservation conflict, device not ready, etc) just 839 * skip the write tests */ 840 for (l = 0; ; l++) { 841 result = spi_execute(sdev, spi_test_unit_ready, DMA_NONE, 842 NULL, 0, NULL); 843 844 if(result) { 845 if(l >= 3) 846 return 0; 847 } else { 848 /* TUR succeeded */ 849 break; 850 } 851 } 852 853 result = spi_execute(sdev, spi_read_buffer_descriptor, 854 DMA_FROM_DEVICE, buffer, 4, NULL); 855 856 if (result) 857 /* Device has no echo buffer */ 858 return 0; 859 860 return buffer[3] + ((buffer[2] & 0x1f) << 8); 861 } 862 863 static void 864 spi_dv_device_internal(struct scsi_device *sdev, u8 *buffer) 865 { 866 struct spi_internal *i = to_spi_internal(sdev->host->transportt); 867 struct scsi_target *starget = sdev->sdev_target; 868 struct Scsi_Host *shost = sdev->host; 869 int len = sdev->inquiry_len; 870 int min_period = spi_min_period(starget); 871 int max_width = spi_max_width(starget); 872 /* first set us up for narrow async */ 873 DV_SET(offset, 0); 874 DV_SET(width, 0); 875 876 if (spi_dv_device_compare_inquiry(sdev, buffer, buffer, DV_LOOPS) 877 != SPI_COMPARE_SUCCESS) { 878 starget_printk(KERN_ERR, starget, "Domain Validation Initial Inquiry Failed\n"); 879 /* FIXME: should probably offline the device here? */ 880 return; 881 } 882 883 if (!spi_support_wide(starget)) { 884 spi_max_width(starget) = 0; 885 max_width = 0; 886 } 887 888 /* test width */ 889 if (i->f->set_width && max_width) { 890 i->f->set_width(starget, 1); 891 892 if (spi_dv_device_compare_inquiry(sdev, buffer, 893 buffer + len, 894 DV_LOOPS) 895 != SPI_COMPARE_SUCCESS) { 896 starget_printk(KERN_ERR, starget, "Wide Transfers Fail\n"); 897 i->f->set_width(starget, 0); 898 /* Make sure we don't force wide back on by asking 899 * for a transfer period that requires it */ 900 max_width = 0; 901 if (min_period < 10) 902 min_period = 10; 903 } 904 } 905 906 if (!i->f->set_period) 907 return; 908 909 /* device can't handle synchronous */ 910 if (!spi_support_sync(starget) && !spi_support_dt(starget)) 911 return; 912 913 /* len == -1 is the signal that we need to ascertain the 914 * presence of an echo buffer before trying to use it. len == 915 * 0 means we don't have an echo buffer */ 916 len = -1; 917 918 retry: 919 920 /* now set up to the maximum */ 921 DV_SET(offset, spi_max_offset(starget)); 922 DV_SET(period, min_period); 923 924 /* try QAS requests; this should be harmless to set if the 925 * target supports it */ 926 if (spi_support_qas(starget) && spi_max_qas(starget)) { 927 DV_SET(qas, 1); 928 } else { 929 DV_SET(qas, 0); 930 } 931 932 if (spi_support_ius(starget) && spi_max_iu(starget) && 933 min_period < 9) { 934 /* This u320 (or u640). Set IU transfers */ 935 DV_SET(iu, 1); 936 /* Then set the optional parameters */ 937 DV_SET(rd_strm, 1); 938 DV_SET(wr_flow, 1); 939 DV_SET(rti, 1); 940 if (min_period == 8) 941 DV_SET(pcomp_en, 1); 942 } else { 943 DV_SET(iu, 0); 944 } 945 946 /* now that we've done all this, actually check the bus 947 * signal type (if known). Some devices are stupid on 948 * a SE bus and still claim they can try LVD only settings */ 949 if (i->f->get_signalling) 950 i->f->get_signalling(shost); 951 if (spi_signalling(shost) == SPI_SIGNAL_SE || 952 spi_signalling(shost) == SPI_SIGNAL_HVD || 953 !spi_support_dt(starget)) { 954 DV_SET(dt, 0); 955 } else { 956 DV_SET(dt, 1); 957 } 958 /* set width last because it will pull all the other 959 * parameters down to required values */ 960 DV_SET(width, max_width); 961 962 /* Do the read only INQUIRY tests */ 963 spi_dv_retrain(sdev, buffer, buffer + sdev->inquiry_len, 964 spi_dv_device_compare_inquiry); 965 /* See if we actually managed to negotiate and sustain DT */ 966 if (i->f->get_dt) 967 i->f->get_dt(starget); 968 969 /* see if the device has an echo buffer. If it does we can do 970 * the SPI pattern write tests. Because of some broken 971 * devices, we *only* try this on a device that has actually 972 * negotiated DT */ 973 974 if (len == -1 && spi_dt(starget)) 975 len = spi_dv_device_get_echo_buffer(sdev, buffer); 976 977 if (len <= 0) { 978 starget_printk(KERN_INFO, starget, "Domain Validation skipping write tests\n"); 979 return; 980 } 981 982 if (len > SPI_MAX_ECHO_BUFFER_SIZE) { 983 starget_printk(KERN_WARNING, starget, "Echo buffer size %d is too big, trimming to %d\n", len, SPI_MAX_ECHO_BUFFER_SIZE); 984 len = SPI_MAX_ECHO_BUFFER_SIZE; 985 } 986 987 if (spi_dv_retrain(sdev, buffer, buffer + len, 988 spi_dv_device_echo_buffer) 989 == SPI_COMPARE_SKIP_TEST) { 990 /* OK, the stupid drive can't do a write echo buffer 991 * test after all, fall back to the read tests */ 992 len = 0; 993 goto retry; 994 } 995 } 996 997 998 /** spi_dv_device - Do Domain Validation on the device 999 * @sdev: scsi device to validate 1000 * 1001 * Performs the domain validation on the given device in the 1002 * current execution thread. Since DV operations may sleep, 1003 * the current thread must have user context. Also no SCSI 1004 * related locks that would deadlock I/O issued by the DV may 1005 * be held. 1006 */ 1007 void 1008 spi_dv_device(struct scsi_device *sdev) 1009 { 1010 struct scsi_target *starget = sdev->sdev_target; 1011 u8 *buffer; 1012 const int len = SPI_MAX_ECHO_BUFFER_SIZE*2; 1013 1014 if (unlikely(spi_dv_in_progress(starget))) 1015 return; 1016 1017 if (unlikely(scsi_device_get(sdev))) 1018 return; 1019 spi_dv_in_progress(starget) = 1; 1020 1021 buffer = kzalloc(len, GFP_KERNEL); 1022 1023 if (unlikely(!buffer)) 1024 goto out_put; 1025 1026 /* We need to verify that the actual device will quiesce; the 1027 * later target quiesce is just a nice to have */ 1028 if (unlikely(scsi_device_quiesce(sdev))) 1029 goto out_free; 1030 1031 scsi_target_quiesce(starget); 1032 1033 spi_dv_pending(starget) = 1; 1034 mutex_lock(&spi_dv_mutex(starget)); 1035 1036 starget_printk(KERN_INFO, starget, "Beginning Domain Validation\n"); 1037 1038 spi_dv_device_internal(sdev, buffer); 1039 1040 starget_printk(KERN_INFO, starget, "Ending Domain Validation\n"); 1041 1042 mutex_unlock(&spi_dv_mutex(starget)); 1043 spi_dv_pending(starget) = 0; 1044 1045 scsi_target_resume(starget); 1046 1047 spi_initial_dv(starget) = 1; 1048 1049 out_free: 1050 kfree(buffer); 1051 out_put: 1052 spi_dv_in_progress(starget) = 0; 1053 scsi_device_put(sdev); 1054 } 1055 EXPORT_SYMBOL(spi_dv_device); 1056 1057 struct work_queue_wrapper { 1058 struct work_struct work; 1059 struct scsi_device *sdev; 1060 }; 1061 1062 static void 1063 spi_dv_device_work_wrapper(struct work_struct *work) 1064 { 1065 struct work_queue_wrapper *wqw = 1066 container_of(work, struct work_queue_wrapper, work); 1067 struct scsi_device *sdev = wqw->sdev; 1068 1069 kfree(wqw); 1070 spi_dv_device(sdev); 1071 spi_dv_pending(sdev->sdev_target) = 0; 1072 scsi_device_put(sdev); 1073 } 1074 1075 1076 /** 1077 * spi_schedule_dv_device - schedule domain validation to occur on the device 1078 * @sdev: The device to validate 1079 * 1080 * Identical to spi_dv_device() above, except that the DV will be 1081 * scheduled to occur in a workqueue later. All memory allocations 1082 * are atomic, so may be called from any context including those holding 1083 * SCSI locks. 1084 */ 1085 void 1086 spi_schedule_dv_device(struct scsi_device *sdev) 1087 { 1088 struct work_queue_wrapper *wqw = 1089 kmalloc(sizeof(struct work_queue_wrapper), GFP_ATOMIC); 1090 1091 if (unlikely(!wqw)) 1092 return; 1093 1094 if (unlikely(spi_dv_pending(sdev->sdev_target))) { 1095 kfree(wqw); 1096 return; 1097 } 1098 /* Set pending early (dv_device doesn't check it, only sets it) */ 1099 spi_dv_pending(sdev->sdev_target) = 1; 1100 if (unlikely(scsi_device_get(sdev))) { 1101 kfree(wqw); 1102 spi_dv_pending(sdev->sdev_target) = 0; 1103 return; 1104 } 1105 1106 INIT_WORK(&wqw->work, spi_dv_device_work_wrapper); 1107 wqw->sdev = sdev; 1108 1109 schedule_work(&wqw->work); 1110 } 1111 EXPORT_SYMBOL(spi_schedule_dv_device); 1112 1113 /** 1114 * spi_display_xfer_agreement - Print the current target transfer agreement 1115 * @starget: The target for which to display the agreement 1116 * 1117 * Each SPI port is required to maintain a transfer agreement for each 1118 * other port on the bus. This function prints a one-line summary of 1119 * the current agreement; more detailed information is available in sysfs. 1120 */ 1121 void spi_display_xfer_agreement(struct scsi_target *starget) 1122 { 1123 struct spi_transport_attrs *tp; 1124 tp = (struct spi_transport_attrs *)&starget->starget_data; 1125 1126 if (tp->offset > 0 && tp->period > 0) { 1127 unsigned int picosec, kb100; 1128 char *scsi = "FAST-?"; 1129 char tmp[8]; 1130 1131 if (tp->period <= SPI_STATIC_PPR) { 1132 picosec = ppr_to_ps[tp->period]; 1133 switch (tp->period) { 1134 case 7: scsi = "FAST-320"; break; 1135 case 8: scsi = "FAST-160"; break; 1136 case 9: scsi = "FAST-80"; break; 1137 case 10: 1138 case 11: scsi = "FAST-40"; break; 1139 case 12: scsi = "FAST-20"; break; 1140 } 1141 } else { 1142 picosec = tp->period * 4000; 1143 if (tp->period < 25) 1144 scsi = "FAST-20"; 1145 else if (tp->period < 50) 1146 scsi = "FAST-10"; 1147 else 1148 scsi = "FAST-5"; 1149 } 1150 1151 kb100 = (10000000 + picosec / 2) / picosec; 1152 if (tp->width) 1153 kb100 *= 2; 1154 sprint_frac(tmp, picosec, 1000); 1155 1156 dev_info(&starget->dev, 1157 "%s %sSCSI %d.%d MB/s %s%s%s%s%s%s%s%s (%s ns, offset %d)\n", 1158 scsi, tp->width ? "WIDE " : "", kb100/10, kb100 % 10, 1159 tp->dt ? "DT" : "ST", 1160 tp->iu ? " IU" : "", 1161 tp->qas ? " QAS" : "", 1162 tp->rd_strm ? " RDSTRM" : "", 1163 tp->rti ? " RTI" : "", 1164 tp->wr_flow ? " WRFLOW" : "", 1165 tp->pcomp_en ? " PCOMP" : "", 1166 tp->hold_mcs ? " HMCS" : "", 1167 tmp, tp->offset); 1168 } else { 1169 dev_info(&starget->dev, "%sasynchronous\n", 1170 tp->width ? "wide " : ""); 1171 } 1172 } 1173 EXPORT_SYMBOL(spi_display_xfer_agreement); 1174 1175 int spi_populate_width_msg(unsigned char *msg, int width) 1176 { 1177 msg[0] = EXTENDED_MESSAGE; 1178 msg[1] = 2; 1179 msg[2] = EXTENDED_WDTR; 1180 msg[3] = width; 1181 return 4; 1182 } 1183 EXPORT_SYMBOL_GPL(spi_populate_width_msg); 1184 1185 int spi_populate_sync_msg(unsigned char *msg, int period, int offset) 1186 { 1187 msg[0] = EXTENDED_MESSAGE; 1188 msg[1] = 3; 1189 msg[2] = EXTENDED_SDTR; 1190 msg[3] = period; 1191 msg[4] = offset; 1192 return 5; 1193 } 1194 EXPORT_SYMBOL_GPL(spi_populate_sync_msg); 1195 1196 int spi_populate_ppr_msg(unsigned char *msg, int period, int offset, 1197 int width, int options) 1198 { 1199 msg[0] = EXTENDED_MESSAGE; 1200 msg[1] = 6; 1201 msg[2] = EXTENDED_PPR; 1202 msg[3] = period; 1203 msg[4] = 0; 1204 msg[5] = offset; 1205 msg[6] = width; 1206 msg[7] = options; 1207 return 8; 1208 } 1209 EXPORT_SYMBOL_GPL(spi_populate_ppr_msg); 1210 1211 /** 1212 * spi_populate_tag_msg - place a tag message in a buffer 1213 * @msg: pointer to the area to place the tag 1214 * @cmd: pointer to the scsi command for the tag 1215 * 1216 * Notes: 1217 * designed to create the correct type of tag message for the 1218 * particular request. Returns the size of the tag message. 1219 * May return 0 if TCQ is disabled for this device. 1220 **/ 1221 int spi_populate_tag_msg(unsigned char *msg, struct scsi_cmnd *cmd) 1222 { 1223 if (cmd->flags & SCMD_TAGGED) { 1224 *msg++ = SIMPLE_QUEUE_TAG; 1225 *msg++ = cmd->request->tag; 1226 return 2; 1227 } 1228 1229 return 0; 1230 } 1231 EXPORT_SYMBOL_GPL(spi_populate_tag_msg); 1232 1233 #ifdef CONFIG_SCSI_CONSTANTS 1234 static const char * const one_byte_msgs[] = { 1235 /* 0x00 */ "Task Complete", NULL /* Extended Message */, "Save Pointers", 1236 /* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error", 1237 /* 0x06 */ "Abort Task Set", "Message Reject", "Nop", "Message Parity Error", 1238 /* 0x0a */ "Linked Command Complete", "Linked Command Complete w/flag", 1239 /* 0x0c */ "Target Reset", "Abort Task", "Clear Task Set", 1240 /* 0x0f */ "Initiate Recovery", "Release Recovery", 1241 /* 0x11 */ "Terminate Process", "Continue Task", "Target Transfer Disable", 1242 /* 0x14 */ NULL, NULL, "Clear ACA", "LUN Reset" 1243 }; 1244 1245 static const char * const two_byte_msgs[] = { 1246 /* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag", 1247 /* 0x23 */ "Ignore Wide Residue", "ACA" 1248 }; 1249 1250 static const char * const extended_msgs[] = { 1251 /* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request", 1252 /* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request", 1253 /* 0x04 */ "Parallel Protocol Request", "Modify Bidirectional Data Pointer" 1254 }; 1255 1256 static void print_nego(const unsigned char *msg, int per, int off, int width) 1257 { 1258 if (per) { 1259 char buf[20]; 1260 period_to_str(buf, msg[per]); 1261 printk("period = %s ns ", buf); 1262 } 1263 1264 if (off) 1265 printk("offset = %d ", msg[off]); 1266 if (width) 1267 printk("width = %d ", 8 << msg[width]); 1268 } 1269 1270 static void print_ptr(const unsigned char *msg, int msb, const char *desc) 1271 { 1272 int ptr = (msg[msb] << 24) | (msg[msb+1] << 16) | (msg[msb+2] << 8) | 1273 msg[msb+3]; 1274 printk("%s = %d ", desc, ptr); 1275 } 1276 1277 int spi_print_msg(const unsigned char *msg) 1278 { 1279 int len = 1, i; 1280 if (msg[0] == EXTENDED_MESSAGE) { 1281 len = 2 + msg[1]; 1282 if (len == 2) 1283 len += 256; 1284 if (msg[2] < ARRAY_SIZE(extended_msgs)) 1285 printk ("%s ", extended_msgs[msg[2]]); 1286 else 1287 printk ("Extended Message, reserved code (0x%02x) ", 1288 (int) msg[2]); 1289 switch (msg[2]) { 1290 case EXTENDED_MODIFY_DATA_POINTER: 1291 print_ptr(msg, 3, "pointer"); 1292 break; 1293 case EXTENDED_SDTR: 1294 print_nego(msg, 3, 4, 0); 1295 break; 1296 case EXTENDED_WDTR: 1297 print_nego(msg, 0, 0, 3); 1298 break; 1299 case EXTENDED_PPR: 1300 print_nego(msg, 3, 5, 6); 1301 break; 1302 case EXTENDED_MODIFY_BIDI_DATA_PTR: 1303 print_ptr(msg, 3, "out"); 1304 print_ptr(msg, 7, "in"); 1305 break; 1306 default: 1307 for (i = 2; i < len; ++i) 1308 printk("%02x ", msg[i]); 1309 } 1310 /* Identify */ 1311 } else if (msg[0] & 0x80) { 1312 printk("Identify disconnect %sallowed %s %d ", 1313 (msg[0] & 0x40) ? "" : "not ", 1314 (msg[0] & 0x20) ? "target routine" : "lun", 1315 msg[0] & 0x7); 1316 /* Normal One byte */ 1317 } else if (msg[0] < 0x1f) { 1318 if (msg[0] < ARRAY_SIZE(one_byte_msgs) && one_byte_msgs[msg[0]]) 1319 printk("%s ", one_byte_msgs[msg[0]]); 1320 else 1321 printk("reserved (%02x) ", msg[0]); 1322 } else if (msg[0] == 0x55) { 1323 printk("QAS Request "); 1324 /* Two byte */ 1325 } else if (msg[0] <= 0x2f) { 1326 if ((msg[0] - 0x20) < ARRAY_SIZE(two_byte_msgs)) 1327 printk("%s %02x ", two_byte_msgs[msg[0] - 0x20], 1328 msg[1]); 1329 else 1330 printk("reserved two byte (%02x %02x) ", 1331 msg[0], msg[1]); 1332 len = 2; 1333 } else 1334 printk("reserved "); 1335 return len; 1336 } 1337 EXPORT_SYMBOL(spi_print_msg); 1338 1339 #else /* ifndef CONFIG_SCSI_CONSTANTS */ 1340 1341 int spi_print_msg(const unsigned char *msg) 1342 { 1343 int len = 1, i; 1344 1345 if (msg[0] == EXTENDED_MESSAGE) { 1346 len = 2 + msg[1]; 1347 if (len == 2) 1348 len += 256; 1349 for (i = 0; i < len; ++i) 1350 printk("%02x ", msg[i]); 1351 /* Identify */ 1352 } else if (msg[0] & 0x80) { 1353 printk("%02x ", msg[0]); 1354 /* Normal One byte */ 1355 } else if ((msg[0] < 0x1f) || (msg[0] == 0x55)) { 1356 printk("%02x ", msg[0]); 1357 /* Two byte */ 1358 } else if (msg[0] <= 0x2f) { 1359 printk("%02x %02x", msg[0], msg[1]); 1360 len = 2; 1361 } else 1362 printk("%02x ", msg[0]); 1363 return len; 1364 } 1365 EXPORT_SYMBOL(spi_print_msg); 1366 #endif /* ! CONFIG_SCSI_CONSTANTS */ 1367 1368 static int spi_device_match(struct attribute_container *cont, 1369 struct device *dev) 1370 { 1371 struct scsi_device *sdev; 1372 struct Scsi_Host *shost; 1373 struct spi_internal *i; 1374 1375 if (!scsi_is_sdev_device(dev)) 1376 return 0; 1377 1378 sdev = to_scsi_device(dev); 1379 shost = sdev->host; 1380 if (!shost->transportt || shost->transportt->host_attrs.ac.class 1381 != &spi_host_class.class) 1382 return 0; 1383 /* Note: this class has no device attributes, so it has 1384 * no per-HBA allocation and thus we don't need to distinguish 1385 * the attribute containers for the device */ 1386 i = to_spi_internal(shost->transportt); 1387 if (i->f->deny_binding && i->f->deny_binding(sdev->sdev_target)) 1388 return 0; 1389 return 1; 1390 } 1391 1392 static int spi_target_match(struct attribute_container *cont, 1393 struct device *dev) 1394 { 1395 struct Scsi_Host *shost; 1396 struct scsi_target *starget; 1397 struct spi_internal *i; 1398 1399 if (!scsi_is_target_device(dev)) 1400 return 0; 1401 1402 shost = dev_to_shost(dev->parent); 1403 if (!shost->transportt || shost->transportt->host_attrs.ac.class 1404 != &spi_host_class.class) 1405 return 0; 1406 1407 i = to_spi_internal(shost->transportt); 1408 starget = to_scsi_target(dev); 1409 1410 if (i->f->deny_binding && i->f->deny_binding(starget)) 1411 return 0; 1412 1413 return &i->t.target_attrs.ac == cont; 1414 } 1415 1416 static DECLARE_TRANSPORT_CLASS(spi_transport_class, 1417 "spi_transport", 1418 spi_setup_transport_attrs, 1419 NULL, 1420 spi_target_configure); 1421 1422 static DECLARE_ANON_TRANSPORT_CLASS(spi_device_class, 1423 spi_device_match, 1424 spi_device_configure); 1425 1426 static struct attribute *host_attributes[] = { 1427 &dev_attr_signalling.attr, 1428 &dev_attr_host_width.attr, 1429 &dev_attr_hba_id.attr, 1430 NULL 1431 }; 1432 1433 static struct attribute_group host_attribute_group = { 1434 .attrs = host_attributes, 1435 }; 1436 1437 static int spi_host_configure(struct transport_container *tc, 1438 struct device *dev, 1439 struct device *cdev) 1440 { 1441 struct kobject *kobj = &cdev->kobj; 1442 struct Scsi_Host *shost = transport_class_to_shost(cdev); 1443 struct spi_internal *si = to_spi_internal(shost->transportt); 1444 struct attribute *attr = &dev_attr_signalling.attr; 1445 int rc = 0; 1446 1447 if (si->f->set_signalling) 1448 rc = sysfs_chmod_file(kobj, attr, attr->mode | S_IWUSR); 1449 1450 return rc; 1451 } 1452 1453 /* returns true if we should be showing the variable. Also 1454 * overloads the return by setting 1<<1 if the attribute should 1455 * be writeable */ 1456 #define TARGET_ATTRIBUTE_HELPER(name) \ 1457 (si->f->show_##name ? S_IRUGO : 0) | \ 1458 (si->f->set_##name ? S_IWUSR : 0) 1459 1460 static umode_t target_attribute_is_visible(struct kobject *kobj, 1461 struct attribute *attr, int i) 1462 { 1463 struct device *cdev = container_of(kobj, struct device, kobj); 1464 struct scsi_target *starget = transport_class_to_starget(cdev); 1465 struct Scsi_Host *shost = transport_class_to_shost(cdev); 1466 struct spi_internal *si = to_spi_internal(shost->transportt); 1467 1468 if (attr == &dev_attr_period.attr && 1469 spi_support_sync(starget)) 1470 return TARGET_ATTRIBUTE_HELPER(period); 1471 else if (attr == &dev_attr_min_period.attr && 1472 spi_support_sync(starget)) 1473 return TARGET_ATTRIBUTE_HELPER(period); 1474 else if (attr == &dev_attr_offset.attr && 1475 spi_support_sync(starget)) 1476 return TARGET_ATTRIBUTE_HELPER(offset); 1477 else if (attr == &dev_attr_max_offset.attr && 1478 spi_support_sync(starget)) 1479 return TARGET_ATTRIBUTE_HELPER(offset); 1480 else if (attr == &dev_attr_width.attr && 1481 spi_support_wide(starget)) 1482 return TARGET_ATTRIBUTE_HELPER(width); 1483 else if (attr == &dev_attr_max_width.attr && 1484 spi_support_wide(starget)) 1485 return TARGET_ATTRIBUTE_HELPER(width); 1486 else if (attr == &dev_attr_iu.attr && 1487 spi_support_ius(starget)) 1488 return TARGET_ATTRIBUTE_HELPER(iu); 1489 else if (attr == &dev_attr_max_iu.attr && 1490 spi_support_ius(starget)) 1491 return TARGET_ATTRIBUTE_HELPER(iu); 1492 else if (attr == &dev_attr_dt.attr && 1493 spi_support_dt(starget)) 1494 return TARGET_ATTRIBUTE_HELPER(dt); 1495 else if (attr == &dev_attr_qas.attr && 1496 spi_support_qas(starget)) 1497 return TARGET_ATTRIBUTE_HELPER(qas); 1498 else if (attr == &dev_attr_max_qas.attr && 1499 spi_support_qas(starget)) 1500 return TARGET_ATTRIBUTE_HELPER(qas); 1501 else if (attr == &dev_attr_wr_flow.attr && 1502 spi_support_ius(starget)) 1503 return TARGET_ATTRIBUTE_HELPER(wr_flow); 1504 else if (attr == &dev_attr_rd_strm.attr && 1505 spi_support_ius(starget)) 1506 return TARGET_ATTRIBUTE_HELPER(rd_strm); 1507 else if (attr == &dev_attr_rti.attr && 1508 spi_support_ius(starget)) 1509 return TARGET_ATTRIBUTE_HELPER(rti); 1510 else if (attr == &dev_attr_pcomp_en.attr && 1511 spi_support_ius(starget)) 1512 return TARGET_ATTRIBUTE_HELPER(pcomp_en); 1513 else if (attr == &dev_attr_hold_mcs.attr && 1514 spi_support_ius(starget)) 1515 return TARGET_ATTRIBUTE_HELPER(hold_mcs); 1516 else if (attr == &dev_attr_revalidate.attr) 1517 return S_IWUSR; 1518 1519 return 0; 1520 } 1521 1522 static struct attribute *target_attributes[] = { 1523 &dev_attr_period.attr, 1524 &dev_attr_min_period.attr, 1525 &dev_attr_offset.attr, 1526 &dev_attr_max_offset.attr, 1527 &dev_attr_width.attr, 1528 &dev_attr_max_width.attr, 1529 &dev_attr_iu.attr, 1530 &dev_attr_max_iu.attr, 1531 &dev_attr_dt.attr, 1532 &dev_attr_qas.attr, 1533 &dev_attr_max_qas.attr, 1534 &dev_attr_wr_flow.attr, 1535 &dev_attr_rd_strm.attr, 1536 &dev_attr_rti.attr, 1537 &dev_attr_pcomp_en.attr, 1538 &dev_attr_hold_mcs.attr, 1539 &dev_attr_revalidate.attr, 1540 NULL 1541 }; 1542 1543 static struct attribute_group target_attribute_group = { 1544 .attrs = target_attributes, 1545 .is_visible = target_attribute_is_visible, 1546 }; 1547 1548 static int spi_target_configure(struct transport_container *tc, 1549 struct device *dev, 1550 struct device *cdev) 1551 { 1552 struct kobject *kobj = &cdev->kobj; 1553 1554 /* force an update based on parameters read from the device */ 1555 sysfs_update_group(kobj, &target_attribute_group); 1556 1557 return 0; 1558 } 1559 1560 struct scsi_transport_template * 1561 spi_attach_transport(struct spi_function_template *ft) 1562 { 1563 struct spi_internal *i = kzalloc(sizeof(struct spi_internal), 1564 GFP_KERNEL); 1565 1566 if (unlikely(!i)) 1567 return NULL; 1568 1569 i->t.target_attrs.ac.class = &spi_transport_class.class; 1570 i->t.target_attrs.ac.grp = &target_attribute_group; 1571 i->t.target_attrs.ac.match = spi_target_match; 1572 transport_container_register(&i->t.target_attrs); 1573 i->t.target_size = sizeof(struct spi_transport_attrs); 1574 i->t.host_attrs.ac.class = &spi_host_class.class; 1575 i->t.host_attrs.ac.grp = &host_attribute_group; 1576 i->t.host_attrs.ac.match = spi_host_match; 1577 transport_container_register(&i->t.host_attrs); 1578 i->t.host_size = sizeof(struct spi_host_attrs); 1579 i->f = ft; 1580 1581 return &i->t; 1582 } 1583 EXPORT_SYMBOL(spi_attach_transport); 1584 1585 void spi_release_transport(struct scsi_transport_template *t) 1586 { 1587 struct spi_internal *i = to_spi_internal(t); 1588 1589 transport_container_unregister(&i->t.target_attrs); 1590 transport_container_unregister(&i->t.host_attrs); 1591 1592 kfree(i); 1593 } 1594 EXPORT_SYMBOL(spi_release_transport); 1595 1596 static __init int spi_transport_init(void) 1597 { 1598 int error = scsi_dev_info_add_list(SCSI_DEVINFO_SPI, 1599 "SCSI Parallel Transport Class"); 1600 if (!error) { 1601 int i; 1602 1603 for (i = 0; spi_static_device_list[i].vendor; i++) 1604 scsi_dev_info_list_add_keyed(1, /* compatible */ 1605 spi_static_device_list[i].vendor, 1606 spi_static_device_list[i].model, 1607 NULL, 1608 spi_static_device_list[i].flags, 1609 SCSI_DEVINFO_SPI); 1610 } 1611 1612 error = transport_class_register(&spi_transport_class); 1613 if (error) 1614 return error; 1615 error = anon_transport_class_register(&spi_device_class); 1616 return transport_class_register(&spi_host_class); 1617 } 1618 1619 static void __exit spi_transport_exit(void) 1620 { 1621 transport_class_unregister(&spi_transport_class); 1622 anon_transport_class_unregister(&spi_device_class); 1623 transport_class_unregister(&spi_host_class); 1624 scsi_dev_info_remove_list(SCSI_DEVINFO_SPI); 1625 } 1626 1627 MODULE_AUTHOR("Martin Hicks"); 1628 MODULE_DESCRIPTION("SPI Transport Attributes"); 1629 MODULE_LICENSE("GPL"); 1630 1631 module_init(spi_transport_init); 1632 module_exit(spi_transport_exit); 1633