.. | .. |
---|
| 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 | } |
---|