aboutsummaryrefslogtreecommitdiff
path: root/miscutils/hdparm.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-07-14 22:07:14 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-07-14 22:07:14 +0000
commitfb79a2e2cfe33002398f1898c26d8e4f341db006 (patch)
treef5b3ee27db5bc8c9b181fbec171f8fa430a75ba5 /miscutils/hdparm.c
parentfcfaf2e18aba06dd90b16958ecfbfcfbf59ceb02 (diff)
downloadbusybox-w32-fb79a2e2cfe33002398f1898c26d8e4f341db006.tar.gz
busybox-w32-fb79a2e2cfe33002398f1898c26d8e4f341db006.tar.bz2
busybox-w32-fb79a2e2cfe33002398f1898c26d8e4f341db006.zip
xioctl and friends by Tito <farmatito@tiscali.it>
function old new delta do_iptunnel 203 977 +774 process_dev 5328 5494 +166 ioctl_or_perror - 54 +54 ioctl_or_perror_and_die - 51 +51 ioctl_alt_func - 49 +49 bb_ioctl_or_warn - 47 +47 do_add_ioctl 102 145 +43 bb_xioctl - 39 +39 print_value_on_off - 31 +31 get_lcm 105 123 +18 arp_main 2155 2167 +12 .................. zcip_main 1576 1566 -10 setlogcons_main 92 82 -10 dumpkmap_main 263 253 -10 do_get_ioctl 85 75 -10 setkeycodes_main 165 154 -11 write_table 244 232 -12 vconfig_main 318 306 -12 do_del_ioctl 93 81 -12 set_address 75 62 -13 maybe_set_utc 30 16 -14 loadfont_main 495 479 -16 slattach_main 712 695 -17 do_loadfont 191 174 -17 do_iplink 1155 1136 -19 getty_main 2583 2562 -21 fbset_main 2058 2035 -23 do_time 588 565 -23 xioctl 25 - -25 read_rtc 186 160 -26 parse_conf 1299 1270 -29 udhcp_read_interface 269 239 -30 bb_ioctl 45 - -45 bb_ioctl_alt 70 - -70 bb_ioctl_on_off 78 - -78 .rodata 129370 129018 -352 do_show 799 - -799 ------------------------------------------------------------------------------ (add/remove: 6/5 grow/shrink: 13/49 up/down: 1316/-1864) Total: -548 bytes text data bss dec hex filename 675352 2740 13968 692060 a8f5c busybox_old 674804 2740 13968 691512 a8d38 busybox_unstripped
Diffstat (limited to 'miscutils/hdparm.c')
-rw-r--r--miscutils/hdparm.c158
1 files changed, 81 insertions, 77 deletions
diff --git a/miscutils/hdparm.c b/miscutils/hdparm.c
index fe4c67a9a..5c7d1f60c 100644
--- a/miscutils/hdparm.c
+++ b/miscutils/hdparm.c
@@ -200,8 +200,7 @@ static const char * const ata1_cfg_str[] = { /* word 0 in ATA-1 mode */
200#define MULTIPLE_SETTING_VALID 0x0100 /* 1=multiple sector setting is valid */ 200#define MULTIPLE_SETTING_VALID 0x0100 /* 1=multiple sector setting is valid */
201 201
202/* word 49: capabilities 0 */ 202/* word 49: capabilities 0 */
203#define STD_STBY 0x2000 /* 1=standard values supported (ATA); 203#define STD_STBY 0x2000 /* 1=standard values supported (ATA); 0=vendor specific values */
204 0=vendor specific values */
205#define IORDY_SUP 0x0800 /* 1=support; 0=may be supported */ 204#define IORDY_SUP 0x0800 /* 1=support; 0=may be supported */
206#define IORDY_OFF 0x0400 /* 1=may be disabled */ 205#define IORDY_OFF 0x0400 /* 1=may be disabled */
207#define LBA_SUP 0x0200 /* 1=Logical Block Address support */ 206#define LBA_SUP 0x0200 /* 1=Logical Block Address support */
@@ -442,25 +441,29 @@ static const char * const secu_str[] = {
442#undef DO_FLUSHCACHE /* under construction: force cache flush on -W0 */ 441#undef DO_FLUSHCACHE /* under construction: force cache flush on -W0 */
443 442
444/* Busybox messages and functions */ 443/* Busybox messages and functions */
445static int bb_ioctl(int fd, int request, void *argp, const char *string) 444#if ENABLE_IOCTL_HEX2STR_ERROR
445static int ioctl_alt_func(int fd, int cmd, unsigned char *args, int alt, const char *string)
446{ 446{
447 int e = ioctl(fd, request, argp); 447 if (!ioctl(fd, cmd, args))
448 if (e && string) 448 return 0;
449 bb_perror_msg(" %s", string); 449 args[0] = alt;
450 return e; 450 return bb_ioctl_or_warn(fd, cmd, args, string);
451} 451}
452 452#define ioctl_alt_or_warn(fd,cmd,args,alt) ioctl_alt_func(fd,cmd,args,alt,#cmd)
453static int bb_ioctl_alt(int fd, int cmd, unsigned char *args, int alt, const char *string) 453#else
454static int ioctl_alt_func(int fd, int cmd, unsigned char *args, int alt)
454{ 455{
455 if (!ioctl(fd, cmd, args)) 456 if (!ioctl(fd, cmd, args))
456 return 0; 457 return 0;
457 args[0] = alt; 458 args[0] = alt;
458 return bb_ioctl(fd, cmd, args, string); 459 return bb_ioctl_or_warn(fd, cmd, args);
459} 460}
461#define ioctl_alt_or_warn(fd,cmd,args,alt) ioctl_alt_func(fd,cmd,args,alt)
462#endif
460 463
461static void on_off(int value) 464static void on_off(int value)
462{ 465{
463 printf(value ? " (on)\n" : " (off)\n"); 466 puts(value ? " (on)" : " (off)");
464} 467}
465 468
466static void print_flag_on_off(int get_arg, const char *s, unsigned long arg) 469static void print_flag_on_off(int get_arg, const char *s, unsigned long arg)
@@ -471,15 +474,10 @@ static void print_flag_on_off(int get_arg, const char *s, unsigned long arg)
471 } 474 }
472} 475}
473 476
474static void bb_ioctl_on_off(int fd, int request, void *argp, const char *string, 477static void print_value_on_off(const char *str, unsigned long argp)
475 const char * str)
476{ 478{
477 if (ioctl(fd, request, &argp) != 0) 479 printf(" %s\t= %2ld", str, argp);
478 bb_perror_msg(" %s", string); 480 on_off(argp != 0);
479 else {
480 printf(" %s\t= %2ld", str, (unsigned long) argp);
481 on_off(((unsigned long) argp) != 0);
482 }
483} 481}
484 482
485#if ENABLE_FEATURE_HDPARM_GET_IDENTITY 483#if ENABLE_FEATURE_HDPARM_GET_IDENTITY
@@ -1245,11 +1243,15 @@ static void dump_identity(const struct hd_driveid *id)
1245static void flush_buffer_cache(int fd) 1243static void flush_buffer_cache(int fd)
1246{ 1244{
1247 fsync(fd); /* flush buffers */ 1245 fsync(fd); /* flush buffers */
1248 bb_ioctl(fd, BLKFLSBUF, NULL, "BLKFLSBUF"); /* do it again, big time */ 1246 ioctl_or_warn(fd, BLKFLSBUF, NULL); /* do it again, big time */
1249#ifdef HDIO_DRIVE_CMD 1247#ifdef HDIO_DRIVE_CMD
1250 sleep(1); 1248 sleep(1);
1251 if (ioctl(fd, HDIO_DRIVE_CMD, NULL) && errno != EINVAL) /* await completion */ 1249 if (ioctl(fd, HDIO_DRIVE_CMD, NULL) && errno != EINVAL) { /* await completion */
1252 bb_perror_msg("HDIO_DRIVE_CMD"); 1250 if (ENABLE_IOCTL_HEX2STR_ERROR) /* To be coherent with ioctl_or_warn */
1251 bb_perror_msg("HDIO_DRIVE_CMD");
1252 else
1253 bb_perror_msg("ioctl %#x failed", HDIO_DRIVE_CMD);
1254 }
1253#endif 1255#endif
1254} 1256}
1255 1257
@@ -1284,9 +1286,7 @@ static int do_blkgetsize(int fd, unsigned long long *blksize64)
1284 *blksize64 /= 512; 1286 *blksize64 /= 512;
1285 return 0; 1287 return 0;
1286 } 1288 }
1287 rc = ioctl(fd, BLKGETSIZE, &blksize32); // returns sectors 1289 rc = ioctl_or_warn(fd, BLKGETSIZE, &blksize32); // returns sectors
1288 if (rc)
1289 bb_perror_msg("BLKGETSIZE");
1290 *blksize64 = blksize32; 1290 *blksize64 = blksize32;
1291 return rc; 1291 return rc;
1292} 1292}
@@ -1516,12 +1516,12 @@ static void process_dev(char *devname)
1516 1516
1517 if (set_readahead) { 1517 if (set_readahead) {
1518 print_flag(get_readahead, "fs readahead", Xreadahead); 1518 print_flag(get_readahead, "fs readahead", Xreadahead);
1519 bb_ioctl(fd, BLKRASET, (int *)Xreadahead, "BLKRASET"); 1519 ioctl_or_warn(fd, BLKRASET, (int *)Xreadahead);
1520 } 1520 }
1521#if ENABLE_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF 1521#if ENABLE_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF
1522 if (unregister_hwif) { 1522 if (unregister_hwif) {
1523 printf(" attempting to unregister hwif#%lu\n", hwif); 1523 printf(" attempting to unregister hwif#%lu\n", hwif);
1524 bb_ioctl(fd, HDIO_UNREGISTER_HWIF, (int *)(unsigned long)hwif, "HDIO_UNREGISTER_HWIF"); 1524 ioctl_or_warn(fd, HDIO_UNREGISTER_HWIF, (int *)(unsigned long)hwif);
1525 } 1525 }
1526#endif 1526#endif
1527#if ENABLE_FEATURE_HDPARM_HDIO_SCAN_HWIF 1527#if ENABLE_FEATURE_HDPARM_HDIO_SCAN_HWIF
@@ -1530,7 +1530,7 @@ static void process_dev(char *devname)
1530 args[0] = hwif_data; 1530 args[0] = hwif_data;
1531 args[1] = hwif_ctrl; 1531 args[1] = hwif_ctrl;
1532 args[2] = hwif_irq; 1532 args[2] = hwif_irq;
1533 bb_ioctl(fd, HDIO_SCAN_HWIF, args, "HDIO_SCAN_HWIF"); 1533 ioctl_or_warn(fd, HDIO_SCAN_HWIF, args);
1534 args[0] = WIN_SETFEATURES; 1534 args[0] = WIN_SETFEATURES;
1535 args[1] = 0; 1535 args[1] = 0;
1536 } 1536 }
@@ -1547,70 +1547,70 @@ static void process_dev(char *devname)
1547 else 1547 else
1548 printf("set UDMA mode to %d\n", (piomode-200)); 1548 printf("set UDMA mode to %d\n", (piomode-200));
1549 } 1549 }
1550 bb_ioctl(fd, HDIO_SET_PIO_MODE, (int *)(unsigned long)piomode, "HDIO_SET_PIO_MODE"); 1550 ioctl_or_warn(fd, HDIO_SET_PIO_MODE, (int *)(unsigned long)piomode);
1551 } 1551 }
1552 if (set_io32bit) { 1552 if (set_io32bit) {
1553 print_flag(get_io32bit, "32-bit IO_support flag", io32bit); 1553 print_flag(get_io32bit, "32-bit IO_support flag", io32bit);
1554 bb_ioctl(fd, HDIO_SET_32BIT, (int *)io32bit, "HDIO_SET_32BIT"); 1554 ioctl_or_warn(fd, HDIO_SET_32BIT, (int *)io32bit);
1555 } 1555 }
1556 if (set_mult) { 1556 if (set_mult) {
1557 print_flag(get_mult, "multcount", mult); 1557 print_flag(get_mult, "multcount", mult);
1558#ifdef HDIO_DRIVE_CMD 1558#ifdef HDIO_DRIVE_CMD
1559 bb_ioctl(fd, HDIO_SET_MULTCOUNT, (void *)mult, "HDIO_SET_MULTCOUNT"); 1559 ioctl_or_warn(fd, HDIO_SET_MULTCOUNT, (void *)mult);
1560#else 1560#else
1561 force_operation |= (!bb_ioctl(fd, HDIO_SET_MULTCOUNT, (void *)mult, "HDIO_SET_MULTCOUNT")); 1561 force_operation |= (!ioctl_or_warn(fd, HDIO_SET_MULTCOUNT, (void *)mult));
1562#endif 1562#endif
1563 } 1563 }
1564 if (set_readonly) { 1564 if (set_readonly) {
1565 print_flag_on_off(get_readonly, "readonly", readonly); 1565 print_flag_on_off(get_readonly, "readonly", readonly);
1566 bb_ioctl(fd, BLKROSET, &readonly, "BLKROSET"); 1566 ioctl_or_warn(fd, BLKROSET, &readonly);
1567 } 1567 }
1568 if (set_unmask) { 1568 if (set_unmask) {
1569 print_flag_on_off(get_unmask, "unmaskirq", unmask); 1569 print_flag_on_off(get_unmask, "unmaskirq", unmask);
1570 bb_ioctl(fd, HDIO_SET_UNMASKINTR, (int *)unmask, "HDIO_SET_UNMASKINTR"); 1570 ioctl_or_warn(fd, HDIO_SET_UNMASKINTR, (int *)unmask);
1571 } 1571 }
1572#if ENABLE_FEATURE_HDPARM_HDIO_GETSET_DMA 1572#if ENABLE_FEATURE_HDPARM_HDIO_GETSET_DMA
1573 if (set_dma) { 1573 if (set_dma) {
1574 print_flag_on_off(get_dma, "using_dma", dma); 1574 print_flag_on_off(get_dma, "using_dma", dma);
1575 bb_ioctl(fd, HDIO_SET_DMA, (int *)dma, "HDIO_SET_DMA"); 1575 ioctl_or_warn(fd, HDIO_SET_DMA, (int *)dma);
1576 } 1576 }
1577#endif /* FEATURE_HDPARM_HDIO_GETSET_DMA */ 1577#endif /* FEATURE_HDPARM_HDIO_GETSET_DMA */
1578 if (set_dma_q) { 1578 if (set_dma_q) {
1579 print_flag_on_off(get_dma_q, "DMA queue_depth", dma_q); 1579 print_flag_on_off(get_dma_q, "DMA queue_depth", dma_q);
1580 bb_ioctl(fd, HDIO_SET_QDMA, (int *)dma_q, "HDIO_SET_QDMA"); 1580 ioctl_or_warn(fd, HDIO_SET_QDMA, (int *)dma_q);
1581 } 1581 }
1582 if (set_nowerr) { 1582 if (set_nowerr) {
1583 print_flag_on_off(get_nowerr, "nowerr", nowerr); 1583 print_flag_on_off(get_nowerr, "nowerr", nowerr);
1584 bb_ioctl(fd, HDIO_SET_NOWERR, (int *)nowerr, "HDIO_SET_NOWERR"); 1584 ioctl_or_warn(fd, HDIO_SET_NOWERR, (int *)nowerr);
1585 } 1585 }
1586 if (set_keep) { 1586 if (set_keep) {
1587 print_flag_on_off(get_keep, "keep_settings", keep); 1587 print_flag_on_off(get_keep, "keep_settings", keep);
1588 bb_ioctl(fd, HDIO_SET_KEEPSETTINGS, (int *)keep, "HDIO_SET_KEEPSETTINGS"); 1588 ioctl_or_warn(fd, HDIO_SET_KEEPSETTINGS, (int *)keep);
1589 } 1589 }
1590#ifdef HDIO_DRIVE_CMD 1590#ifdef HDIO_DRIVE_CMD
1591 if (set_doorlock) { 1591 if (set_doorlock) {
1592 args[0] = doorlock ? WIN_DOORLOCK : WIN_DOORUNLOCK; 1592 args[0] = doorlock ? WIN_DOORLOCK : WIN_DOORUNLOCK;
1593 args[2] = 0; 1593 args[2] = 0;
1594 print_flag_on_off(get_doorlock, "drive doorlock", doorlock); 1594 print_flag_on_off(get_doorlock, "drive doorlock", doorlock);
1595 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(doorlock)"); 1595 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1596 args[0] = WIN_SETFEATURES; 1596 args[0] = WIN_SETFEATURES;
1597 } 1597 }
1598 if (set_dkeep) { 1598 if (set_dkeep) {
1599 /* lock/unlock the drive's "feature" settings */ 1599 /* lock/unlock the drive's "feature" settings */
1600 print_flag_on_off(get_dkeep, "drive keep features", dkeep); 1600 print_flag_on_off(get_dkeep, "drive keep features", dkeep);
1601 args[2] = dkeep ? 0x66 : 0xcc; 1601 args[2] = dkeep ? 0x66 : 0xcc;
1602 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(keepsettings)"); 1602 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1603 } 1603 }
1604 if (set_defects) { 1604 if (set_defects) {
1605 args[2] = defects ? 0x04 : 0x84; 1605 args[2] = defects ? 0x04 : 0x84;
1606 print_flag(get_defects, "drive defect-mgmt", defects); 1606 print_flag(get_defects, "drive defect-mgmt", defects);
1607 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(defectmgmt)"); 1607 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1608 } 1608 }
1609 if (set_prefetch) { 1609 if (set_prefetch) {
1610 args[1] = prefetch; 1610 args[1] = prefetch;
1611 args[2] = 0xab; 1611 args[2] = 0xab;
1612 print_flag(get_prefetch, "drive prefetch", prefetch); 1612 print_flag(get_prefetch, "drive prefetch", prefetch);
1613 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(setprefetch)"); 1613 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1614 args[1] = 0; 1614 args[1] = 0;
1615 } 1615 }
1616 if (set_xfermode) { 1616 if (set_xfermode) {
@@ -1620,20 +1620,20 @@ static void process_dev(char *devname)
1620 print_flag(1, "xfermode", xfermode_requested); 1620 print_flag(1, "xfermode", xfermode_requested);
1621 interpret_xfermode(xfermode_requested); 1621 interpret_xfermode(xfermode_requested);
1622 } 1622 }
1623 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(setxfermode)"); 1623 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1624 args[1] = 0; 1624 args[1] = 0;
1625 } 1625 }
1626 if (set_lookahead) { 1626 if (set_lookahead) {
1627 args[2] = lookahead ? 0xaa : 0x55; 1627 args[2] = lookahead ? 0xaa : 0x55;
1628 print_flag_on_off(get_lookahead, "drive read-lookahead", lookahead); 1628 print_flag_on_off(get_lookahead, "drive read-lookahead", lookahead);
1629 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(setreadahead)"); 1629 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1630 } 1630 }
1631 if (set_apmmode) { 1631 if (set_apmmode) {
1632 args[2] = (apmmode == 255) ? 0x85 /* disable */ : 0x05 /* set */; /* feature register */ 1632 args[2] = (apmmode == 255) ? 0x85 /* disable */ : 0x05 /* set */; /* feature register */
1633 args[1] = apmmode; /* sector count register 1-255 */ 1633 args[1] = apmmode; /* sector count register 1-255 */
1634 if (get_apmmode) 1634 if (get_apmmode)
1635 printf(" setting APM level to %s 0x%02lX (%ld)\n", (apmmode == 255) ? "disabled" : "", apmmode, apmmode); 1635 printf(" setting APM level to %s 0x%02lX (%ld)\n", (apmmode == 255) ? "disabled" : "", apmmode, apmmode);
1636 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD"); 1636 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1637 args[1] = 0; 1637 args[1] = 0;
1638 } 1638 }
1639 if (set_wcache) { 1639 if (set_wcache) {
@@ -1647,12 +1647,12 @@ static void process_dev(char *devname)
1647 print_flag_on_off(get_wcache, "drive write-caching", wcache); 1647 print_flag_on_off(get_wcache, "drive write-caching", wcache);
1648#ifdef DO_FLUSHCACHE 1648#ifdef DO_FLUSHCACHE
1649 if (!wcache) 1649 if (!wcache)
1650 bb_ioctl(fd, HDIO_DRIVE_CMD, &flushcache, "HDIO_DRIVE_CMD(flushcache)"); 1650 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &flushcache);
1651#endif /* DO_FLUSHCACHE */ 1651#endif /* DO_FLUSHCACHE */
1652 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(setcache)"); 1652 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1653#ifdef DO_FLUSHCACHE 1653#ifdef DO_FLUSHCACHE
1654 if (!wcache) 1654 if (!wcache)
1655 bb_ioctl(fd, HDIO_DRIVE_CMD, &flushcache, "HDIO_DRIVE_CMD(flushcache)"); 1655 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &flushcache);
1656#endif /* DO_FLUSHCACHE */ 1656#endif /* DO_FLUSHCACHE */
1657 } 1657 }
1658 1658
@@ -1669,7 +1669,7 @@ static void process_dev(char *devname)
1669#endif 1669#endif
1670 if (get_standbynow) printf(" issuing standby command\n"); 1670 if (get_standbynow) printf(" issuing standby command\n");
1671 args[0] = WIN_STANDBYNOW1; 1671 args[0] = WIN_STANDBYNOW1;
1672 bb_ioctl_alt(fd, HDIO_DRIVE_CMD, args, WIN_STANDBYNOW2, "HDIO_DRIVE_CMD(standby)"); 1672 ioctl_alt_or_warn(fd, HDIO_DRIVE_CMD, args, WIN_STANDBYNOW2);
1673 } 1673 }
1674 if (set_sleepnow) { 1674 if (set_sleepnow) {
1675#ifndef WIN_SLEEPNOW1 1675#ifndef WIN_SLEEPNOW1
@@ -1680,12 +1680,12 @@ static void process_dev(char *devname)
1680#endif 1680#endif
1681 if (get_sleepnow) printf(" issuing sleep command\n"); 1681 if (get_sleepnow) printf(" issuing sleep command\n");
1682 args[0] = WIN_SLEEPNOW1; 1682 args[0] = WIN_SLEEPNOW1;
1683 bb_ioctl_alt(fd, HDIO_DRIVE_CMD, args, WIN_SLEEPNOW2, "HDIO_DRIVE_CMD(sleep)"); 1683 ioctl_alt_or_warn(fd, HDIO_DRIVE_CMD, args, WIN_SLEEPNOW2);
1684 } 1684 }
1685 if (set_seagate) { 1685 if (set_seagate) {
1686 args[0] = 0xfb; 1686 args[0] = 0xfb;
1687 if (get_seagate) printf(" disabling Seagate auto powersaving mode\n"); 1687 if (get_seagate) printf(" disabling Seagate auto powersaving mode\n");
1688 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(seagatepwrsave)"); 1688 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1689 } 1689 }
1690 if (set_standby) { 1690 if (set_standby) {
1691 args[0] = WIN_SETIDLE1; 1691 args[0] = WIN_SETIDLE1;
@@ -1694,7 +1694,7 @@ static void process_dev(char *devname)
1694 print_flag(1, "standby", standby_requested); 1694 print_flag(1, "standby", standby_requested);
1695 interpret_standby(standby_requested); 1695 interpret_standby(standby_requested);
1696 } 1696 }
1697 bb_ioctl(fd, HDIO_DRIVE_CMD, &args, "HDIO_DRIVE_CMD(setidle1)"); 1697 ioctl_or_warn(fd, HDIO_DRIVE_CMD, &args);
1698 args[1] = 0; 1698 args[1] = 0;
1699 } 1699 }
1700#else /* HDIO_DRIVE_CMD */ 1700#else /* HDIO_DRIVE_CMD */
@@ -1709,15 +1709,17 @@ static void process_dev(char *devname)
1709 if (get_mult || get_identity) { 1709 if (get_mult || get_identity) {
1710 multcount = -1; 1710 multcount = -1;
1711 if (ioctl(fd, HDIO_GET_MULTCOUNT, &multcount)) { 1711 if (ioctl(fd, HDIO_GET_MULTCOUNT, &multcount)) {
1712 if (get_mult) 1712 if (get_mult && ENABLE_IOCTL_HEX2STR_ERROR) /* To be coherent with ioctl_or_warn. */
1713 bb_perror_msg("HDIO_GET_MULTCOUNT"); 1713 bb_perror_msg("HDIO_GET_MULTCOUNT");
1714 else
1715 bb_perror_msg("ioctl %#x failed", HDIO_GET_MULTCOUNT);
1714 } else if (get_mult) { 1716 } else if (get_mult) {
1715 printf(fmt, "multcount", multcount); 1717 printf(fmt, "multcount", multcount);
1716 on_off(multcount != 0); 1718 on_off(multcount != 0);
1717 } 1719 }
1718 } 1720 }
1719 if (get_io32bit) { 1721 if (get_io32bit) {
1720 if (!bb_ioctl(fd, HDIO_GET_32BIT, &parm, "HDIO_GET_32BIT")) { 1722 if (!ioctl_or_warn(fd, HDIO_GET_32BIT, &parm)) {
1721 printf(" IO_support\t=%3ld (", parm); 1723 printf(" IO_support\t=%3ld (", parm);
1722 if (parm == 0) 1724 if (parm == 0)
1723 printf("default 16-bit)\n"); 1725 printf("default 16-bit)\n");
@@ -1734,14 +1736,14 @@ static void process_dev(char *devname)
1734 } 1736 }
1735 } 1737 }
1736 if (get_unmask) { 1738 if (get_unmask) {
1737 bb_ioctl_on_off(fd, HDIO_GET_UNMASKINTR, (unsigned long *)parm, 1739 if(!ioctl_or_warn(fd, HDIO_GET_UNMASKINTR, (unsigned long *)parm))
1738 "HDIO_GET_UNMASKINTR", "unmaskirq"); 1740 print_value_on_off("unmaskirq", parm);
1739 } 1741 }
1740 1742
1741 1743
1742#if ENABLE_FEATURE_HDPARM_HDIO_GETSET_DMA 1744#if ENABLE_FEATURE_HDPARM_HDIO_GETSET_DMA
1743 if (get_dma) { 1745 if (get_dma) {
1744 if (!bb_ioctl(fd, HDIO_GET_DMA, &parm, "HDIO_GET_DMA")) { 1746 if (!ioctl_or_warn(fd, HDIO_GET_DMA, &parm)) {
1745 printf(fmt, "using_dma", parm); 1747 printf(fmt, "using_dma", parm);
1746 if (parm == 8) 1748 if (parm == 8)
1747 printf(" (DMA-Assisted-PIO)\n"); 1749 printf(" (DMA-Assisted-PIO)\n");
@@ -1751,31 +1753,31 @@ static void process_dev(char *devname)
1751 } 1753 }
1752#endif 1754#endif
1753 if (get_dma_q) { 1755 if (get_dma_q) {
1754 bb_ioctl_on_off(fd, HDIO_GET_QDMA, (unsigned long *)parm, 1756 if(!ioctl_or_warn(fd, HDIO_GET_QDMA, (unsigned long *)parm))
1755 "HDIO_GET_QDMA", "queue_depth"); 1757 print_value_on_off("queue_depth", parm);
1756 } 1758 }
1757 if (get_keep) { 1759 if (get_keep) {
1758 bb_ioctl_on_off(fd, HDIO_GET_KEEPSETTINGS, (unsigned long *)parm, 1760 if(!ioctl_or_warn(fd, HDIO_GET_KEEPSETTINGS, (unsigned long *)parm))
1759 "HDIO_GET_KEEPSETTINGS", "keepsettings"); 1761 print_value_on_off("keepsettings", parm);
1760 } 1762 }
1761 1763
1762 if (get_nowerr) { 1764 if (get_nowerr) {
1763 bb_ioctl_on_off(fd, HDIO_GET_NOWERR, (unsigned long *)&parm, 1765 if(!ioctl_or_warn(fd, HDIO_GET_NOWERR, (unsigned long *)parm))
1764 "HDIO_GET_NOWERR", "nowerr"); 1766 print_value_on_off("nowerr", parm);
1765 } 1767 }
1766 if (get_readonly) { 1768 if (get_readonly) {
1767 bb_ioctl_on_off(fd, BLKROGET, (unsigned long *)parm, 1769 if(!ioctl_or_warn(fd, BLKROGET, (unsigned long *)parm))
1768 "BLKROGET", "readonly"); 1770 print_value_on_off("readonly", parm);
1769 } 1771 }
1770 if (get_readahead) { 1772 if (get_readahead) {
1771 bb_ioctl_on_off(fd, BLKRAGET, (unsigned long *) parm, 1773 if(!ioctl_or_warn(fd, BLKRAGET, (unsigned long *)parm))
1772 "BLKRAGET", "readahead"); 1774 print_value_on_off("readahead", parm);
1773 } 1775 }
1774 if (get_geom) { 1776 if (get_geom) {
1775 if (!bb_ioctl(fd, BLKGETSIZE, &parm, "BLKGETSIZE")) { 1777 if (!ioctl_or_warn(fd, BLKGETSIZE, &parm)) {
1776 struct hd_geometry g; 1778 struct hd_geometry g;
1777 1779
1778 if (!bb_ioctl(fd, HDIO_GETGEO, &g, "HDIO_GETGEO")) 1780 if (!ioctl_or_warn(fd, HDIO_GETGEO, &g))
1779 printf(" geometry\t= %u/%u/%u, sectors = %ld, start = %ld\n", 1781 printf(" geometry\t= %u/%u/%u, sectors = %ld, start = %ld\n",
1780 g.cylinders, g.heads, g.sectors, parm, g.start); 1782 g.cylinders, g.heads, g.sectors, parm, g.start);
1781 } 1783 }
@@ -1791,7 +1793,7 @@ static void process_dev(char *devname)
1791 const char *state; 1793 const char *state;
1792 1794
1793 args[0] = WIN_CHECKPOWERMODE1; 1795 args[0] = WIN_CHECKPOWERMODE1;
1794 if (bb_ioctl_alt(fd, HDIO_DRIVE_CMD, args, WIN_CHECKPOWERMODE2, 0)) { 1796 if (ioctl_alt_or_warn(fd, HDIO_DRIVE_CMD, args, WIN_CHECKPOWERMODE2)) {
1795 if (errno != EIO || args[0] != 0 || args[1] != 0) 1797 if (errno != EIO || args[0] != 0 || args[1] != 0)
1796 state = "unknown"; 1798 state = "unknown";
1797 else 1799 else
@@ -1805,14 +1807,14 @@ static void process_dev(char *devname)
1805#endif 1807#endif
1806#if ENABLE_FEATURE_HDPARM_HDIO_DRIVE_RESET 1808#if ENABLE_FEATURE_HDPARM_HDIO_DRIVE_RESET
1807 if (perform_reset) { 1809 if (perform_reset) {
1808 bb_ioctl(fd, HDIO_DRIVE_RESET, NULL, "HDIO_DRIVE_RESET"); 1810 ioctl_or_warn(fd, HDIO_DRIVE_RESET, NULL);
1809 } 1811 }
1810#endif /* FEATURE_HDPARM_HDIO_DRIVE_RESET */ 1812#endif /* FEATURE_HDPARM_HDIO_DRIVE_RESET */
1811#if ENABLE_FEATURE_HDPARM_HDIO_TRISTATE_HWIF 1813#if ENABLE_FEATURE_HDPARM_HDIO_TRISTATE_HWIF
1812 if (perform_tristate) { 1814 if (perform_tristate) {
1813 args[0] = 0; 1815 args[0] = 0;
1814 args[1] = tristate; 1816 args[1] = tristate;
1815 bb_ioctl(fd, HDIO_TRISTATE_HWIF, &args, "HDIO_TRISTATE_HWIF"); 1817 ioctl_or_warn(fd, HDIO_TRISTATE_HWIF, &args);
1816 } 1818 }
1817#endif /* FEATURE_HDPARM_HDIO_TRISTATE_HWIF */ 1819#endif /* FEATURE_HDPARM_HDIO_TRISTATE_HWIF */
1818#if ENABLE_FEATURE_HDPARM_GET_IDENTITY 1820#if ENABLE_FEATURE_HDPARM_GET_IDENTITY
@@ -1828,8 +1830,10 @@ static void process_dev(char *devname)
1828 dump_identity(&id); 1830 dump_identity(&id);
1829 } else if (errno == -ENOMSG) 1831 } else if (errno == -ENOMSG)
1830 printf(" no identification info available\n"); 1832 printf(" no identification info available\n");
1833 else if (ENABLE_IOCTL_HEX2STR_ERROR) /* To be coherent with ioctl_or_warn */
1834 bb_perror_msg("HDIO_GET_IDENTITY");
1831 else 1835 else
1832 bb_perror_msg("HDIO_GET_IDENTITY"); 1836 bb_perror_msg("ioctl %#x failed", HDIO_GET_IDENTITY);
1833 } 1837 }
1834 1838
1835 if (get_IDentity) { 1839 if (get_IDentity) {
@@ -1838,7 +1842,7 @@ static void process_dev(char *devname)
1838 memset(args1, 0, sizeof(args1)); 1842 memset(args1, 0, sizeof(args1));
1839 args1[0] = WIN_IDENTIFY; 1843 args1[0] = WIN_IDENTIFY;
1840 args1[3] = 1; 1844 args1[3] = 1;
1841 if (!bb_ioctl_alt(fd, HDIO_DRIVE_CMD, args1, WIN_PIDENTIFY, "HDIO_DRIVE_CMD(identify)")) 1845 if (!ioctl_alt_or_warn(fd, HDIO_DRIVE_CMD, args1, WIN_PIDENTIFY))
1842 identify((void *)(args1 + 4)); 1846 identify((void *)(args1 + 4));
1843 } 1847 }
1844#endif 1848#endif
@@ -1848,17 +1852,17 @@ static void process_dev(char *devname)
1848 print_flag(1, "bus state", busstate); 1852 print_flag(1, "bus state", busstate);
1849 bus_state_value(busstate); 1853 bus_state_value(busstate);
1850 } 1854 }
1851 bb_ioctl(fd, HDIO_SET_BUSSTATE, (int *)(unsigned long)busstate, "HDIO_SET_BUSSTATE"); 1855 ioctl_or_warn(fd, HDIO_SET_BUSSTATE, (int *)(unsigned long)busstate);
1852 } 1856 }
1853 if (get_busstate) { 1857 if (get_busstate) {
1854 if (!bb_ioctl(fd, HDIO_GET_BUSSTATE, &parm, "HDIO_GET_BUSSTATE")) { 1858 if (!ioctl_or_warn(fd, HDIO_GET_BUSSTATE, &parm)) {
1855 printf(fmt, "bus state", parm); 1859 printf(fmt, "bus state", parm);
1856 bus_state_value(parm); 1860 bus_state_value(parm);
1857 } 1861 }
1858 } 1862 }
1859#endif 1863#endif
1860 if (reread_partn) 1864 if (reread_partn)
1861 bb_ioctl(fd, BLKRRPART, NULL, "BLKRRPART"); 1865 ioctl_or_warn(fd, BLKRRPART, NULL);
1862 1866
1863 if (do_ctimings) 1867 if (do_ctimings)
1864 do_time(0, fd); /* time cache */ 1868 do_time(0, fd); /* time cache */