1#include <linux/kernel.h> 2#include <linux/ide.h> 3 4char *ide_media_string(ide_drive_t *drive) 5{ 6 switch (drive->media) { 7 case ide_disk: 8 return "disk"; 9 case ide_cdrom: 10 return "cdrom"; 11 case ide_tape: 12 return "tape"; 13 case ide_floppy: 14 return "floppy"; 15 case ide_optical: 16 return "optical"; 17 default: 18 return "UNKNOWN"; 19 } 20} 21 22static ssize_t media_show(struct device *dev, struct device_attribute *attr, 23 char *buf) 24{ 25 ide_drive_t *drive = to_ide_device(dev); 26 return sprintf(buf, "%s\n", ide_media_string(drive)); 27} 28 29static ssize_t drivename_show(struct device *dev, struct device_attribute *attr, 30 char *buf) 31{ 32 ide_drive_t *drive = to_ide_device(dev); 33 return sprintf(buf, "%s\n", drive->name); 34} 35 36static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, 37 char *buf) 38{ 39 ide_drive_t *drive = to_ide_device(dev); 40 return sprintf(buf, "ide:m-%s\n", ide_media_string(drive)); 41} 42 43static ssize_t model_show(struct device *dev, struct device_attribute *attr, 44 char *buf) 45{ 46 ide_drive_t *drive = to_ide_device(dev); 47 return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_PROD]); 48} 49 50static ssize_t firmware_show(struct device *dev, struct device_attribute *attr, 51 char *buf) 52{ 53 ide_drive_t *drive = to_ide_device(dev); 54 return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_FW_REV]); 55} 56 57static ssize_t serial_show(struct device *dev, struct device_attribute *attr, 58 char *buf) 59{ 60 ide_drive_t *drive = to_ide_device(dev); 61 return sprintf(buf, "%s\n", (char *)&drive->id[ATA_ID_SERNO]); 62} 63 64struct device_attribute ide_dev_attrs[] = { 65 __ATTR_RO(media), 66 __ATTR_RO(drivename), 67 __ATTR_RO(modalias), 68 __ATTR_RO(model), 69 __ATTR_RO(firmware), 70 __ATTR(serial, 0400, serial_show, NULL), 71 __ATTR(unload_heads, 0644, ide_park_show, ide_park_store), 72 __ATTR_NULL 73}; 74 75static ssize_t store_delete_devices(struct device *portdev, 76 struct device_attribute *attr, 77 const char *buf, size_t n) 78{ 79 ide_hwif_t *hwif = dev_get_drvdata(portdev); 80 81 if (strncmp(buf, "1", n)) 82 return -EINVAL; 83 84 ide_port_unregister_devices(hwif); 85 86 return n; 87}; 88 89static DEVICE_ATTR(delete_devices, S_IWUSR, NULL, store_delete_devices); 90 91static ssize_t store_scan(struct device *portdev, 92 struct device_attribute *attr, 93 const char *buf, size_t n) 94{ 95 ide_hwif_t *hwif = dev_get_drvdata(portdev); 96 97 if (strncmp(buf, "1", n)) 98 return -EINVAL; 99 100 ide_port_unregister_devices(hwif); 101 ide_port_scan(hwif); 102 103 return n; 104}; 105 106static DEVICE_ATTR(scan, S_IWUSR, NULL, store_scan); 107 108static struct device_attribute *ide_port_attrs[] = { 109 &dev_attr_delete_devices, 110 &dev_attr_scan, 111 NULL 112}; 113 114int ide_sysfs_register_port(ide_hwif_t *hwif) 115{ 116 int i, uninitialized_var(rc); 117 118 for (i = 0; ide_port_attrs[i]; i++) { 119 rc = device_create_file(hwif->portdev, ide_port_attrs[i]); 120 if (rc) 121 break; 122 } 123 124 return rc; 125} 126