| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright 2008 ioogle, Inc. All rights reserved. |
|---|
| 3 | | - * Released under GPL v2. |
|---|
| 4 | 4 | * |
|---|
| 5 | 5 | * Libata transport class. |
|---|
| 6 | 6 | * |
|---|
| .. | .. |
|---|
| 196 | 196 | { XFER_PIO_0, "XFER_PIO_0" }, |
|---|
| 197 | 197 | { XFER_PIO_SLOW, "XFER_PIO_SLOW" } |
|---|
| 198 | 198 | }; |
|---|
| 199 | | -ata_bitfield_name_match(xfer,ata_xfer_names) |
|---|
| 199 | +ata_bitfield_name_search(xfer, ata_xfer_names) |
|---|
| 200 | 200 | |
|---|
| 201 | 201 | /* |
|---|
| 202 | 202 | * ATA Port attributes |
|---|
| .. | .. |
|---|
| 208 | 208 | { \ |
|---|
| 209 | 209 | struct ata_port *ap = transport_class_to_port(dev); \ |
|---|
| 210 | 210 | \ |
|---|
| 211 | | - return snprintf(buf, 20, format_string, cast ap->field); \ |
|---|
| 211 | + return scnprintf(buf, 20, format_string, cast ap->field); \ |
|---|
| 212 | 212 | } |
|---|
| 213 | 213 | |
|---|
| 214 | 214 | #define ata_port_simple_attr(field, name, format_string, type) \ |
|---|
| .. | .. |
|---|
| 266 | 266 | put_device(dev); |
|---|
| 267 | 267 | } |
|---|
| 268 | 268 | |
|---|
| 269 | +static const struct device_type ata_port_sas_type = { |
|---|
| 270 | + .name = ATA_PORT_TYPE_NAME, |
|---|
| 271 | +}; |
|---|
| 272 | + |
|---|
| 269 | 273 | /** ata_tport_add - initialize a transport ATA port structure |
|---|
| 270 | 274 | * |
|---|
| 271 | 275 | * @parent: parent device |
|---|
| .. | .. |
|---|
| 283 | 287 | struct device *dev = &ap->tdev; |
|---|
| 284 | 288 | |
|---|
| 285 | 289 | device_initialize(dev); |
|---|
| 286 | | - dev->type = &ata_port_type; |
|---|
| 290 | + if (ap->flags & ATA_FLAG_SAS_HOST) |
|---|
| 291 | + dev->type = &ata_port_sas_type; |
|---|
| 292 | + else |
|---|
| 293 | + dev->type = &ata_port_type; |
|---|
| 287 | 294 | |
|---|
| 288 | 295 | dev->parent = parent; |
|---|
| 289 | 296 | ata_host_get(ap->host); |
|---|
| .. | .. |
|---|
| 301 | 308 | pm_runtime_enable(dev); |
|---|
| 302 | 309 | pm_runtime_forbid(dev); |
|---|
| 303 | 310 | |
|---|
| 304 | | - transport_add_device(dev); |
|---|
| 311 | + error = transport_add_device(dev); |
|---|
| 312 | + if (error) |
|---|
| 313 | + goto tport_transport_add_err; |
|---|
| 305 | 314 | transport_configure_device(dev); |
|---|
| 306 | 315 | |
|---|
| 307 | 316 | error = ata_tlink_add(&ap->link); |
|---|
| .. | .. |
|---|
| 312 | 321 | |
|---|
| 313 | 322 | tport_link_err: |
|---|
| 314 | 323 | transport_remove_device(dev); |
|---|
| 324 | + tport_transport_add_err: |
|---|
| 315 | 325 | device_del(dev); |
|---|
| 316 | 326 | |
|---|
| 317 | 327 | tport_err: |
|---|
| 318 | 328 | transport_destroy_device(dev); |
|---|
| 319 | 329 | put_device(dev); |
|---|
| 320 | | - ata_host_put(ap->host); |
|---|
| 321 | 330 | return error; |
|---|
| 322 | 331 | } |
|---|
| 323 | 332 | |
|---|
| .. | .. |
|---|
| 426 | 435 | goto tlink_err; |
|---|
| 427 | 436 | } |
|---|
| 428 | 437 | |
|---|
| 429 | | - transport_add_device(dev); |
|---|
| 438 | + error = transport_add_device(dev); |
|---|
| 439 | + if (error) |
|---|
| 440 | + goto tlink_transport_err; |
|---|
| 430 | 441 | transport_configure_device(dev); |
|---|
| 431 | 442 | |
|---|
| 432 | 443 | ata_for_each_dev(ata_dev, link, ALL) { |
|---|
| .. | .. |
|---|
| 441 | 452 | ata_tdev_delete(ata_dev); |
|---|
| 442 | 453 | } |
|---|
| 443 | 454 | transport_remove_device(dev); |
|---|
| 455 | + tlink_transport_err: |
|---|
| 444 | 456 | device_del(dev); |
|---|
| 445 | 457 | tlink_err: |
|---|
| 446 | 458 | transport_destroy_device(dev); |
|---|
| .. | .. |
|---|
| 479 | 491 | { \ |
|---|
| 480 | 492 | struct ata_device *ata_dev = transport_class_to_dev(dev); \ |
|---|
| 481 | 493 | \ |
|---|
| 482 | | - return snprintf(buf, 20, format_string, cast ata_dev->field); \ |
|---|
| 494 | + return scnprintf(buf, 20, format_string, cast ata_dev->field); \ |
|---|
| 483 | 495 | } |
|---|
| 484 | 496 | |
|---|
| 485 | 497 | #define ata_dev_simple_attr(field, format_string, type) \ |
|---|
| .. | .. |
|---|
| 533 | 545 | if (ata_dev->class == ATA_DEV_PMP) |
|---|
| 534 | 546 | return 0; |
|---|
| 535 | 547 | for(i=0;i<ATA_ID_WORDS;i++) { |
|---|
| 536 | | - written += snprintf(buf+written, 20, "%04x%c", |
|---|
| 548 | + written += scnprintf(buf+written, 20, "%04x%c", |
|---|
| 537 | 549 | ata_dev->id[i], |
|---|
| 538 | 550 | ((i+1) & 7) ? ' ' : '\n'); |
|---|
| 539 | 551 | } |
|---|
| .. | .. |
|---|
| 552 | 564 | if (ata_dev->class != ATA_DEV_PMP) |
|---|
| 553 | 565 | return 0; |
|---|
| 554 | 566 | for(i=0;i<SATA_PMP_GSCR_DWORDS;i++) { |
|---|
| 555 | | - written += snprintf(buf+written, 20, "%08x%c", |
|---|
| 567 | + written += scnprintf(buf+written, 20, "%08x%c", |
|---|
| 556 | 568 | ata_dev->gscr[i], |
|---|
| 557 | 569 | ((i+1) & 3) ? ' ' : '\n'); |
|---|
| 558 | 570 | } |
|---|
| .. | .. |
|---|
| 581 | 593 | else |
|---|
| 582 | 594 | mode = "unqueued"; |
|---|
| 583 | 595 | |
|---|
| 584 | | - return snprintf(buf, 20, "%s\n", mode); |
|---|
| 596 | + return scnprintf(buf, 20, "%s\n", mode); |
|---|
| 585 | 597 | } |
|---|
| 586 | 598 | |
|---|
| 587 | 599 | static DEVICE_ATTR(trim, S_IRUGO, show_ata_dev_trim, NULL); |
|---|
| .. | .. |
|---|
| 678 | 690 | return error; |
|---|
| 679 | 691 | } |
|---|
| 680 | 692 | |
|---|
| 681 | | - transport_add_device(dev); |
|---|
| 693 | + error = transport_add_device(dev); |
|---|
| 694 | + if (error) { |
|---|
| 695 | + device_del(dev); |
|---|
| 696 | + ata_tdev_free(ata_dev); |
|---|
| 697 | + return error; |
|---|
| 698 | + } |
|---|
| 699 | + |
|---|
| 682 | 700 | transport_configure_device(dev); |
|---|
| 683 | 701 | return 0; |
|---|
| 684 | 702 | } |
|---|