diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/block/dasd.c | 5 | ||||
-rw-r--r-- | drivers/s390/block/dasd_devmap.c | 10 | ||||
-rw-r--r-- | drivers/s390/block/dasd_int.h | 2 | ||||
-rw-r--r-- | drivers/s390/char/tape_core.c | 31 | ||||
-rw-r--r-- | drivers/s390/char/tty3270.c | 15 | ||||
-rw-r--r-- | drivers/s390/char/vmlogrdr.c | 2 | ||||
-rw-r--r-- | drivers/s390/cio/blacklist.c | 322 | ||||
-rw-r--r-- | drivers/s390/cio/cio.c | 39 | ||||
-rw-r--r-- | drivers/s390/cio/cio.h | 2 | ||||
-rw-r--r-- | drivers/s390/cio/cio_debug.h | 6 | ||||
-rw-r--r-- | drivers/s390/cio/css.c | 4 | ||||
-rw-r--r-- | drivers/s390/cio/device.c | 25 | ||||
-rw-r--r-- | drivers/s390/cio/device_fsm.c | 44 | ||||
-rw-r--r-- | drivers/s390/cio/device_id.c | 4 | ||||
-rw-r--r-- | drivers/s390/cio/device_pgid.c | 24 | ||||
-rw-r--r-- | drivers/s390/kvm/kvm_virtio.c | 40 | ||||
-rw-r--r-- | drivers/s390/s390mach.c | 3 |
17 files changed, 271 insertions, 307 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index ac6d4d3218b3..8ba3f135da22 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -925,6 +925,8 @@ static void dasd_handle_killed_request(struct ccw_device *cdev, | |||
925 | struct dasd_ccw_req *cqr; | 925 | struct dasd_ccw_req *cqr; |
926 | struct dasd_device *device; | 926 | struct dasd_device *device; |
927 | 927 | ||
928 | if (!intparm) | ||
929 | return; | ||
928 | cqr = (struct dasd_ccw_req *) intparm; | 930 | cqr = (struct dasd_ccw_req *) intparm; |
929 | if (cqr->status != DASD_CQR_IN_IO) { | 931 | if (cqr->status != DASD_CQR_IN_IO) { |
930 | MESSAGE(KERN_DEBUG, | 932 | MESSAGE(KERN_DEBUG, |
@@ -976,17 +978,16 @@ void dasd_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
976 | if (IS_ERR(irb)) { | 978 | if (IS_ERR(irb)) { |
977 | switch (PTR_ERR(irb)) { | 979 | switch (PTR_ERR(irb)) { |
978 | case -EIO: | 980 | case -EIO: |
979 | dasd_handle_killed_request(cdev, intparm); | ||
980 | break; | 981 | break; |
981 | case -ETIMEDOUT: | 982 | case -ETIMEDOUT: |
982 | printk(KERN_WARNING"%s(%s): request timed out\n", | 983 | printk(KERN_WARNING"%s(%s): request timed out\n", |
983 | __func__, cdev->dev.bus_id); | 984 | __func__, cdev->dev.bus_id); |
984 | //FIXME - dasd uses own timeout interface... | ||
985 | break; | 985 | break; |
986 | default: | 986 | default: |
987 | printk(KERN_WARNING"%s(%s): unknown error %ld\n", | 987 | printk(KERN_WARNING"%s(%s): unknown error %ld\n", |
988 | __func__, cdev->dev.bus_id, PTR_ERR(irb)); | 988 | __func__, cdev->dev.bus_id, PTR_ERR(irb)); |
989 | } | 989 | } |
990 | dasd_handle_killed_request(cdev, intparm); | ||
990 | return; | 991 | return; |
991 | } | 992 | } |
992 | 993 | ||
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index f4fb40257348..d774e79476fe 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c | |||
@@ -86,10 +86,10 @@ static DEFINE_SPINLOCK(dasd_devmap_lock); | |||
86 | static struct list_head dasd_hashlists[256]; | 86 | static struct list_head dasd_hashlists[256]; |
87 | int dasd_max_devindex; | 87 | int dasd_max_devindex; |
88 | 88 | ||
89 | static struct dasd_devmap *dasd_add_busid(char *, int); | 89 | static struct dasd_devmap *dasd_add_busid(const char *, int); |
90 | 90 | ||
91 | static inline int | 91 | static inline int |
92 | dasd_hash_busid(char *bus_id) | 92 | dasd_hash_busid(const char *bus_id) |
93 | { | 93 | { |
94 | int hash, i; | 94 | int hash, i; |
95 | 95 | ||
@@ -394,7 +394,7 @@ dasd_parse(void) | |||
394 | * devices. | 394 | * devices. |
395 | */ | 395 | */ |
396 | static struct dasd_devmap * | 396 | static struct dasd_devmap * |
397 | dasd_add_busid(char *bus_id, int features) | 397 | dasd_add_busid(const char *bus_id, int features) |
398 | { | 398 | { |
399 | struct dasd_devmap *devmap, *new, *tmp; | 399 | struct dasd_devmap *devmap, *new, *tmp; |
400 | int hash; | 400 | int hash; |
@@ -430,7 +430,7 @@ dasd_add_busid(char *bus_id, int features) | |||
430 | * Find devmap for device with given bus_id. | 430 | * Find devmap for device with given bus_id. |
431 | */ | 431 | */ |
432 | static struct dasd_devmap * | 432 | static struct dasd_devmap * |
433 | dasd_find_busid(char *bus_id) | 433 | dasd_find_busid(const char *bus_id) |
434 | { | 434 | { |
435 | struct dasd_devmap *devmap, *tmp; | 435 | struct dasd_devmap *devmap, *tmp; |
436 | int hash; | 436 | int hash; |
@@ -452,7 +452,7 @@ dasd_find_busid(char *bus_id) | |||
452 | * Check if busid has been added to the list of dasd ranges. | 452 | * Check if busid has been added to the list of dasd ranges. |
453 | */ | 453 | */ |
454 | int | 454 | int |
455 | dasd_busid_known(char *bus_id) | 455 | dasd_busid_known(const char *bus_id) |
456 | { | 456 | { |
457 | return IS_ERR(dasd_find_busid(bus_id)) ? -ENOENT : 0; | 457 | return IS_ERR(dasd_find_busid(bus_id)) ? -ENOENT : 0; |
458 | } | 458 | } |
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index 6c624bf44617..fb2f931cf844 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h | |||
@@ -598,7 +598,7 @@ struct dasd_device *dasd_device_from_cdev_locked(struct ccw_device *); | |||
598 | struct dasd_device *dasd_device_from_devindex(int); | 598 | struct dasd_device *dasd_device_from_devindex(int); |
599 | 599 | ||
600 | int dasd_parse(void); | 600 | int dasd_parse(void); |
601 | int dasd_busid_known(char *); | 601 | int dasd_busid_known(const char *); |
602 | 602 | ||
603 | /* externals in dasd_gendisk.c */ | 603 | /* externals in dasd_gendisk.c */ |
604 | int dasd_gendisk_init(void); | 604 | int dasd_gendisk_init(void); |
diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index 7ad8cf157641..76e44eb7c47f 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c | |||
@@ -76,32 +76,9 @@ const char *tape_op_verbose[TO_SIZE] = | |||
76 | [TO_KEKL_QUERY] = "KLQ",[TO_RDC] = "RDC", | 76 | [TO_KEKL_QUERY] = "KLQ",[TO_RDC] = "RDC", |
77 | }; | 77 | }; |
78 | 78 | ||
79 | static int | 79 | static int devid_to_int(struct ccw_dev_id *dev_id) |
80 | busid_to_int(char *bus_id) | ||
81 | { | 80 | { |
82 | int dec; | 81 | return dev_id->devno + (dev_id->ssid << 16); |
83 | int d; | ||
84 | char * s; | ||
85 | |||
86 | for(s = bus_id, d = 0; *s != '\0' && *s != '.'; s++) | ||
87 | d = (d * 10) + (*s - '0'); | ||
88 | dec = d; | ||
89 | for(s++, d = 0; *s != '\0' && *s != '.'; s++) | ||
90 | d = (d * 10) + (*s - '0'); | ||
91 | dec = (dec << 8) + d; | ||
92 | |||
93 | for(s++; *s != '\0'; s++) { | ||
94 | if (*s >= '0' && *s <= '9') { | ||
95 | d = *s - '0'; | ||
96 | } else if (*s >= 'a' && *s <= 'f') { | ||
97 | d = *s - 'a' + 10; | ||
98 | } else { | ||
99 | d = *s - 'A' + 10; | ||
100 | } | ||
101 | dec = (dec << 4) + d; | ||
102 | } | ||
103 | |||
104 | return dec; | ||
105 | } | 82 | } |
106 | 83 | ||
107 | /* | 84 | /* |
@@ -551,6 +528,7 @@ tape_generic_probe(struct ccw_device *cdev) | |||
551 | { | 528 | { |
552 | struct tape_device *device; | 529 | struct tape_device *device; |
553 | int ret; | 530 | int ret; |
531 | struct ccw_dev_id dev_id; | ||
554 | 532 | ||
555 | device = tape_alloc_device(); | 533 | device = tape_alloc_device(); |
556 | if (IS_ERR(device)) | 534 | if (IS_ERR(device)) |
@@ -565,7 +543,8 @@ tape_generic_probe(struct ccw_device *cdev) | |||
565 | cdev->dev.driver_data = device; | 543 | cdev->dev.driver_data = device; |
566 | cdev->handler = __tape_do_irq; | 544 | cdev->handler = __tape_do_irq; |
567 | device->cdev = cdev; | 545 | device->cdev = cdev; |
568 | device->cdev_id = busid_to_int(cdev->dev.bus_id); | 546 | ccw_device_get_id(cdev, &dev_id); |
547 | device->cdev_id = devid_to_int(&dev_id); | ||
569 | PRINT_INFO("tape device %s found\n", cdev->dev.bus_id); | 548 | PRINT_INFO("tape device %s found\n", cdev->dev.bus_id); |
570 | return ret; | 549 | return ret; |
571 | } | 550 | } |
diff --git a/drivers/s390/char/tty3270.c b/drivers/s390/char/tty3270.c index c1f2adefad41..5043150019ac 100644 --- a/drivers/s390/char/tty3270.c +++ b/drivers/s390/char/tty3270.c | |||
@@ -965,8 +965,7 @@ tty3270_write_room(struct tty_struct *tty) | |||
965 | * Insert character into the screen at the current position with the | 965 | * Insert character into the screen at the current position with the |
966 | * current color and highlight. This function does NOT do cursor movement. | 966 | * current color and highlight. This function does NOT do cursor movement. |
967 | */ | 967 | */ |
968 | static int | 968 | static void tty3270_put_character(struct tty3270 *tp, char ch) |
969 | tty3270_put_character(struct tty3270 *tp, char ch) | ||
970 | { | 969 | { |
971 | struct tty3270_line *line; | 970 | struct tty3270_line *line; |
972 | struct tty3270_cell *cell; | 971 | struct tty3270_cell *cell; |
@@ -986,7 +985,6 @@ tty3270_put_character(struct tty3270 *tp, char ch) | |||
986 | cell->character = tp->view.ascebc[(unsigned int) ch]; | 985 | cell->character = tp->view.ascebc[(unsigned int) ch]; |
987 | cell->highlight = tp->highlight; | 986 | cell->highlight = tp->highlight; |
988 | cell->f_color = tp->f_color; | 987 | cell->f_color = tp->f_color; |
989 | return 1; | ||
990 | } | 988 | } |
991 | 989 | ||
992 | /* | 990 | /* |
@@ -1612,16 +1610,15 @@ tty3270_write(struct tty_struct * tty, | |||
1612 | /* | 1610 | /* |
1613 | * Put single characters to the ttys character buffer | 1611 | * Put single characters to the ttys character buffer |
1614 | */ | 1612 | */ |
1615 | static void | 1613 | static int tty3270_put_char(struct tty_struct *tty, unsigned char ch) |
1616 | tty3270_put_char(struct tty_struct *tty, unsigned char ch) | ||
1617 | { | 1614 | { |
1618 | struct tty3270 *tp; | 1615 | struct tty3270 *tp; |
1619 | 1616 | ||
1620 | tp = tty->driver_data; | 1617 | tp = tty->driver_data; |
1621 | if (!tp) | 1618 | if (!tp || tp->char_count >= TTY3270_CHAR_BUF_SIZE) |
1622 | return; | 1619 | return 0; |
1623 | if (tp->char_count < TTY3270_CHAR_BUF_SIZE) | 1620 | tp->char_buf[tp->char_count++] = ch; |
1624 | tp->char_buf[tp->char_count++] = ch; | 1621 | return 1; |
1625 | } | 1622 | } |
1626 | 1623 | ||
1627 | /* | 1624 | /* |
diff --git a/drivers/s390/char/vmlogrdr.c b/drivers/s390/char/vmlogrdr.c index d364e0bfae12..e8487347e4d4 100644 --- a/drivers/s390/char/vmlogrdr.c +++ b/drivers/s390/char/vmlogrdr.c | |||
@@ -858,7 +858,7 @@ static int __init vmlogrdr_init(void) | |||
858 | for (i=0; i < MAXMINOR; ++i ) { | 858 | for (i=0; i < MAXMINOR; ++i ) { |
859 | sys_ser[i].buffer = (char *) get_zeroed_page(GFP_KERNEL); | 859 | sys_ser[i].buffer = (char *) get_zeroed_page(GFP_KERNEL); |
860 | if (!sys_ser[i].buffer) { | 860 | if (!sys_ser[i].buffer) { |
861 | rc = ENOMEM; | 861 | rc = -ENOMEM; |
862 | break; | 862 | break; |
863 | } | 863 | } |
864 | sys_ser[i].current_position = sys_ser[i].buffer; | 864 | sys_ser[i].current_position = sys_ser[i].buffer; |
diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index 40ef948fcb3a..a4a5f2efea48 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c | |||
@@ -43,164 +43,169 @@ typedef enum {add, free} range_action; | |||
43 | * Function: blacklist_range | 43 | * Function: blacklist_range |
44 | * (Un-)blacklist the devices from-to | 44 | * (Un-)blacklist the devices from-to |
45 | */ | 45 | */ |
46 | static void | 46 | static int blacklist_range(range_action action, unsigned int from_ssid, |
47 | blacklist_range (range_action action, unsigned int from, unsigned int to, | 47 | unsigned int to_ssid, unsigned int from, |
48 | unsigned int ssid) | 48 | unsigned int to, int msgtrigger) |
49 | { | 49 | { |
50 | if (!to) | 50 | if ((from_ssid > to_ssid) || ((from_ssid == to_ssid) && (from > to))) { |
51 | to = from; | 51 | if (msgtrigger) |
52 | 52 | printk(KERN_WARNING "cio: Invalid cio_ignore range " | |
53 | if (from > to || to > __MAX_SUBCHANNEL || ssid > __MAX_SSID) { | 53 | "0.%x.%04x-0.%x.%04x\n", from_ssid, from, |
54 | printk (KERN_WARNING "cio: Invalid blacklist range " | 54 | to_ssid, to); |
55 | "0.%x.%04x to 0.%x.%04x, skipping\n", | 55 | return 1; |
56 | ssid, from, ssid, to); | ||
57 | return; | ||
58 | } | 56 | } |
59 | for (; from <= to; from++) { | 57 | |
58 | while ((from_ssid < to_ssid) || ((from_ssid == to_ssid) && | ||
59 | (from <= to))) { | ||
60 | if (action == add) | 60 | if (action == add) |
61 | set_bit (from, bl_dev[ssid]); | 61 | set_bit(from, bl_dev[from_ssid]); |
62 | else | 62 | else |
63 | clear_bit (from, bl_dev[ssid]); | 63 | clear_bit(from, bl_dev[from_ssid]); |
64 | from++; | ||
65 | if (from > __MAX_SUBCHANNEL) { | ||
66 | from_ssid++; | ||
67 | from = 0; | ||
68 | } | ||
64 | } | 69 | } |
70 | |||
71 | return 0; | ||
65 | } | 72 | } |
66 | 73 | ||
67 | /* | 74 | static int pure_hex(char **cp, unsigned int *val, int min_digit, |
68 | * Function: blacklist_busid | 75 | int max_digit, int max_val) |
69 | * Get devno/busid from given string. | ||
70 | * Shamelessly grabbed from dasd_devmap.c. | ||
71 | */ | ||
72 | static int | ||
73 | blacklist_busid(char **str, int *id0, int *ssid, int *devno) | ||
74 | { | 76 | { |
75 | int val, old_style; | 77 | int diff; |
76 | char *sav; | 78 | unsigned int value; |
77 | 79 | ||
78 | sav = *str; | 80 | diff = 0; |
81 | *val = 0; | ||
79 | 82 | ||
80 | /* check for leading '0x' */ | 83 | while (isxdigit(**cp) && (diff <= max_digit)) { |
81 | old_style = 0; | 84 | |
82 | if ((*str)[0] == '0' && (*str)[1] == 'x') { | 85 | if (isdigit(**cp)) |
83 | *str += 2; | 86 | value = **cp - '0'; |
84 | old_style = 1; | 87 | else |
85 | } | 88 | value = tolower(**cp) - 'a' + 10; |
86 | if (!isxdigit((*str)[0])) /* We require at least one hex digit */ | 89 | *val = *val * 16 + value; |
87 | goto confused; | 90 | (*cp)++; |
88 | val = simple_strtoul(*str, str, 16); | 91 | diff++; |
89 | if (old_style || (*str)[0] != '.') { | ||
90 | *id0 = *ssid = 0; | ||
91 | if (val < 0 || val > 0xffff) | ||
92 | goto confused; | ||
93 | *devno = val; | ||
94 | if ((*str)[0] != ',' && (*str)[0] != '-' && | ||
95 | (*str)[0] != '\n' && (*str)[0] != '\0') | ||
96 | goto confused; | ||
97 | return 0; | ||
98 | } | 92 | } |
99 | /* New style x.y.z busid */ | 93 | |
100 | if (val < 0 || val > 0xff) | 94 | if ((diff < min_digit) || (diff > max_digit) || (*val > max_val)) |
101 | goto confused; | 95 | return 1; |
102 | *id0 = val; | 96 | |
103 | (*str)++; | ||
104 | if (!isxdigit((*str)[0])) /* We require at least one hex digit */ | ||
105 | goto confused; | ||
106 | val = simple_strtoul(*str, str, 16); | ||
107 | if (val < 0 || val > 0xff || (*str)++[0] != '.') | ||
108 | goto confused; | ||
109 | *ssid = val; | ||
110 | if (!isxdigit((*str)[0])) /* We require at least one hex digit */ | ||
111 | goto confused; | ||
112 | val = simple_strtoul(*str, str, 16); | ||
113 | if (val < 0 || val > 0xffff) | ||
114 | goto confused; | ||
115 | *devno = val; | ||
116 | if ((*str)[0] != ',' && (*str)[0] != '-' && | ||
117 | (*str)[0] != '\n' && (*str)[0] != '\0') | ||
118 | goto confused; | ||
119 | return 0; | 97 | return 0; |
120 | confused: | ||
121 | strsep(str, ",\n"); | ||
122 | printk(KERN_WARNING "cio: Invalid cio_ignore parameter '%s'\n", sav); | ||
123 | return 1; | ||
124 | } | 98 | } |
125 | 99 | ||
126 | static int | 100 | static int parse_busid(char *str, int *cssid, int *ssid, int *devno, |
127 | blacklist_parse_parameters (char *str, range_action action) | 101 | int msgtrigger) |
128 | { | 102 | { |
129 | int from, to, from_id0, to_id0, from_ssid, to_ssid; | 103 | char *str_work; |
130 | 104 | int val, rc, ret; | |
131 | while (*str != 0 && *str != '\n') { | 105 | |
132 | range_action ra = action; | 106 | rc = 1; |
133 | while(*str == ',') | 107 | |
134 | str++; | 108 | if (*str == '\0') |
135 | if (*str == '!') { | 109 | goto out; |
136 | ra = !action; | 110 | |
137 | ++str; | 111 | /* old style */ |
112 | str_work = str; | ||
113 | val = simple_strtoul(str, &str_work, 16); | ||
114 | |||
115 | if (*str_work == '\0') { | ||
116 | if (val <= __MAX_SUBCHANNEL) { | ||
117 | *devno = val; | ||
118 | *ssid = 0; | ||
119 | *cssid = 0; | ||
120 | rc = 0; | ||
138 | } | 121 | } |
122 | goto out; | ||
123 | } | ||
139 | 124 | ||
140 | /* | 125 | /* new style */ |
141 | * Since we have to parse the proc commands and the | 126 | str_work = str; |
142 | * kernel arguments we have to check four cases | 127 | ret = pure_hex(&str_work, cssid, 1, 2, __MAX_CSSID); |
143 | */ | 128 | if (ret || (str_work[0] != '.')) |
144 | if (strncmp(str,"all,",4) == 0 || strcmp(str,"all") == 0 || | 129 | goto out; |
145 | strncmp(str,"all\n",4) == 0 || strncmp(str,"all ",4) == 0) { | 130 | str_work++; |
146 | int j; | 131 | ret = pure_hex(&str_work, ssid, 1, 1, __MAX_SSID); |
147 | 132 | if (ret || (str_work[0] != '.')) | |
148 | str += 3; | 133 | goto out; |
149 | for (j=0; j <= __MAX_SSID; j++) | 134 | str_work++; |
150 | blacklist_range(ra, 0, __MAX_SUBCHANNEL, j); | 135 | ret = pure_hex(&str_work, devno, 4, 4, __MAX_SUBCHANNEL); |
151 | } else { | 136 | if (ret || (str_work[0] != '\0')) |
152 | int rc; | 137 | goto out; |
138 | |||
139 | rc = 0; | ||
140 | out: | ||
141 | if (rc && msgtrigger) | ||
142 | printk(KERN_WARNING "cio: Invalid cio_ignore device '%s'\n", | ||
143 | str); | ||
144 | |||
145 | return rc; | ||
146 | } | ||
153 | 147 | ||
154 | rc = blacklist_busid(&str, &from_id0, | 148 | static int blacklist_parse_parameters(char *str, range_action action, |
155 | &from_ssid, &from); | 149 | int msgtrigger) |
156 | if (rc) | 150 | { |
157 | continue; | 151 | int from_cssid, to_cssid, from_ssid, to_ssid, from, to; |
158 | to = from; | 152 | int rc, totalrc; |
159 | to_id0 = from_id0; | 153 | char *parm; |
160 | to_ssid = from_ssid; | 154 | range_action ra; |
161 | if (*str == '-') { | 155 | |
162 | str++; | 156 | totalrc = 0; |
163 | rc = blacklist_busid(&str, &to_id0, | 157 | |
164 | &to_ssid, &to); | 158 | while ((parm = strsep(&str, ","))) { |
165 | if (rc) | 159 | rc = 0; |
166 | continue; | 160 | ra = action; |
167 | } | 161 | if (*parm == '!') { |
168 | if (*str == '-') { | 162 | if (ra == add) |
169 | printk(KERN_WARNING "cio: invalid cio_ignore " | 163 | ra = free; |
170 | "parameter '%s'\n", | 164 | else |
171 | strsep(&str, ",\n")); | 165 | ra = add; |
172 | continue; | 166 | parm++; |
173 | } | 167 | } |
174 | if ((from_id0 != to_id0) || | 168 | if (strcmp(parm, "all") == 0) { |
175 | (from_ssid != to_ssid)) { | 169 | from_cssid = 0; |
176 | printk(KERN_WARNING "cio: invalid cio_ignore " | 170 | from_ssid = 0; |
177 | "range %x.%x.%04x-%x.%x.%04x\n", | 171 | from = 0; |
178 | from_id0, from_ssid, from, | 172 | to_cssid = __MAX_CSSID; |
179 | to_id0, to_ssid, to); | 173 | to_ssid = __MAX_SSID; |
180 | continue; | 174 | to = __MAX_SUBCHANNEL; |
175 | } else { | ||
176 | rc = parse_busid(strsep(&parm, "-"), &from_cssid, | ||
177 | &from_ssid, &from, msgtrigger); | ||
178 | if (!rc) { | ||
179 | if (parm != NULL) | ||
180 | rc = parse_busid(parm, &to_cssid, | ||
181 | &to_ssid, &to, | ||
182 | msgtrigger); | ||
183 | else { | ||
184 | to_cssid = from_cssid; | ||
185 | to_ssid = from_ssid; | ||
186 | to = from; | ||
187 | } | ||
181 | } | 188 | } |
182 | blacklist_range (ra, from, to, to_ssid); | ||
183 | } | 189 | } |
190 | if (!rc) { | ||
191 | rc = blacklist_range(ra, from_ssid, to_ssid, from, to, | ||
192 | msgtrigger); | ||
193 | if (rc) | ||
194 | totalrc = 1; | ||
195 | } else | ||
196 | totalrc = 1; | ||
184 | } | 197 | } |
185 | return 1; | 198 | |
199 | return totalrc; | ||
186 | } | 200 | } |
187 | 201 | ||
188 | /* Parsing the commandline for blacklist parameters, e.g. to blacklist | ||
189 | * bus ids 0.0.1234, 0.0.1235 and 0.0.1236, you could use any of: | ||
190 | * - cio_ignore=1234-1236 | ||
191 | * - cio_ignore=0x1234-0x1235,1236 | ||
192 | * - cio_ignore=0x1234,1235-1236 | ||
193 | * - cio_ignore=1236 cio_ignore=1234-0x1236 | ||
194 | * - cio_ignore=1234 cio_ignore=1236 cio_ignore=0x1235 | ||
195 | * - cio_ignore=0.0.1234-0.0.1236 | ||
196 | * - cio_ignore=0.0.1234,0x1235,1236 | ||
197 | * - ... | ||
198 | */ | ||
199 | static int __init | 202 | static int __init |
200 | blacklist_setup (char *str) | 203 | blacklist_setup (char *str) |
201 | { | 204 | { |
202 | CIO_MSG_EVENT(6, "Reading blacklist parameters\n"); | 205 | CIO_MSG_EVENT(6, "Reading blacklist parameters\n"); |
203 | return blacklist_parse_parameters (str, add); | 206 | if (blacklist_parse_parameters(str, add, 1)) |
207 | return 0; | ||
208 | return 1; | ||
204 | } | 209 | } |
205 | 210 | ||
206 | __setup ("cio_ignore=", blacklist_setup); | 211 | __setup ("cio_ignore=", blacklist_setup); |
@@ -224,27 +229,23 @@ is_blacklisted (int ssid, int devno) | |||
224 | * Function: blacklist_parse_proc_parameters | 229 | * Function: blacklist_parse_proc_parameters |
225 | * parse the stuff which is piped to /proc/cio_ignore | 230 | * parse the stuff which is piped to /proc/cio_ignore |
226 | */ | 231 | */ |
227 | static void | 232 | static int blacklist_parse_proc_parameters(char *buf) |
228 | blacklist_parse_proc_parameters (char *buf) | ||
229 | { | 233 | { |
230 | if (strncmp (buf, "free ", 5) == 0) { | 234 | int rc; |
231 | blacklist_parse_parameters (buf + 5, free); | 235 | char *parm; |
232 | } else if (strncmp (buf, "add ", 4) == 0) { | 236 | |
233 | /* | 237 | parm = strsep(&buf, " "); |
234 | * We don't need to check for known devices since | 238 | |
235 | * css_probe_device will handle this correctly. | 239 | if (strcmp("free", parm) == 0) |
236 | */ | 240 | rc = blacklist_parse_parameters(buf, free, 0); |
237 | blacklist_parse_parameters (buf + 4, add); | 241 | else if (strcmp("add", parm) == 0) |
238 | } else { | 242 | rc = blacklist_parse_parameters(buf, add, 0); |
239 | printk (KERN_WARNING "cio: cio_ignore: Parse error; \n" | 243 | else |
240 | KERN_WARNING "try using 'free all|<devno-range>," | 244 | return 1; |
241 | "<devno-range>,...'\n" | ||
242 | KERN_WARNING "or 'add <devno-range>," | ||
243 | "<devno-range>,...'\n"); | ||
244 | return; | ||
245 | } | ||
246 | 245 | ||
247 | css_schedule_reprobe(); | 246 | css_schedule_reprobe(); |
247 | |||
248 | return rc; | ||
248 | } | 249 | } |
249 | 250 | ||
250 | /* Iterator struct for all devices. */ | 251 | /* Iterator struct for all devices. */ |
@@ -328,6 +329,8 @@ cio_ignore_write(struct file *file, const char __user *user_buf, | |||
328 | size_t user_len, loff_t *offset) | 329 | size_t user_len, loff_t *offset) |
329 | { | 330 | { |
330 | char *buf; | 331 | char *buf; |
332 | size_t i; | ||
333 | ssize_t rc, ret; | ||
331 | 334 | ||
332 | if (*offset) | 335 | if (*offset) |
333 | return -EINVAL; | 336 | return -EINVAL; |
@@ -336,16 +339,27 @@ cio_ignore_write(struct file *file, const char __user *user_buf, | |||
336 | buf = vmalloc (user_len + 1); /* maybe better use the stack? */ | 339 | buf = vmalloc (user_len + 1); /* maybe better use the stack? */ |
337 | if (buf == NULL) | 340 | if (buf == NULL) |
338 | return -ENOMEM; | 341 | return -ENOMEM; |
342 | memset(buf, 0, user_len + 1); | ||
343 | |||
339 | if (strncpy_from_user (buf, user_buf, user_len) < 0) { | 344 | if (strncpy_from_user (buf, user_buf, user_len) < 0) { |
340 | vfree (buf); | 345 | rc = -EFAULT; |
341 | return -EFAULT; | 346 | goto out_free; |
342 | } | 347 | } |
343 | buf[user_len] = '\0'; | ||
344 | 348 | ||
345 | blacklist_parse_proc_parameters (buf); | 349 | i = user_len - 1; |
350 | while ((i >= 0) && (isspace(buf[i]) || (buf[i] == 0))) { | ||
351 | buf[i] = '\0'; | ||
352 | i--; | ||
353 | } | ||
354 | ret = blacklist_parse_proc_parameters(buf); | ||
355 | if (ret) | ||
356 | rc = -EINVAL; | ||
357 | else | ||
358 | rc = user_len; | ||
346 | 359 | ||
360 | out_free: | ||
347 | vfree (buf); | 361 | vfree (buf); |
348 | return user_len; | 362 | return rc; |
349 | } | 363 | } |
350 | 364 | ||
351 | static const struct seq_operations cio_ignore_proc_seq_ops = { | 365 | static const struct seq_operations cio_ignore_proc_seq_ops = { |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 08a578161306..82c6a2d45128 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -39,23 +39,6 @@ debug_info_t *cio_debug_msg_id; | |||
39 | debug_info_t *cio_debug_trace_id; | 39 | debug_info_t *cio_debug_trace_id; |
40 | debug_info_t *cio_debug_crw_id; | 40 | debug_info_t *cio_debug_crw_id; |
41 | 41 | ||
42 | int cio_show_msg; | ||
43 | |||
44 | static int __init | ||
45 | cio_setup (char *parm) | ||
46 | { | ||
47 | if (!strcmp (parm, "yes")) | ||
48 | cio_show_msg = 1; | ||
49 | else if (!strcmp (parm, "no")) | ||
50 | cio_show_msg = 0; | ||
51 | else | ||
52 | printk(KERN_ERR "cio: cio_setup: " | ||
53 | "invalid cio_msg parameter '%s'", parm); | ||
54 | return 1; | ||
55 | } | ||
56 | |||
57 | __setup ("cio_msg=", cio_setup); | ||
58 | |||
59 | /* | 42 | /* |
60 | * Function: cio_debug_init | 43 | * Function: cio_debug_init |
61 | * Initializes three debug logs for common I/O: | 44 | * Initializes three debug logs for common I/O: |
@@ -166,7 +149,7 @@ cio_start_handle_notoper(struct subchannel *sch, __u8 lpm) | |||
166 | 149 | ||
167 | stsch (sch->schid, &sch->schib); | 150 | stsch (sch->schid, &sch->schib); |
168 | 151 | ||
169 | CIO_MSG_EVENT(0, "cio_start: 'not oper' status for " | 152 | CIO_MSG_EVENT(2, "cio_start: 'not oper' status for " |
170 | "subchannel 0.%x.%04x!\n", sch->schid.ssid, | 153 | "subchannel 0.%x.%04x!\n", sch->schid.ssid, |
171 | sch->schid.sch_no); | 154 | sch->schid.sch_no); |
172 | sprintf(dbf_text, "no%s", sch->dev.bus_id); | 155 | sprintf(dbf_text, "no%s", sch->dev.bus_id); |
@@ -567,10 +550,9 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
567 | * ... just being curious we check for non I/O subchannels | 550 | * ... just being curious we check for non I/O subchannels |
568 | */ | 551 | */ |
569 | if (sch->st != 0) { | 552 | if (sch->st != 0) { |
570 | CIO_DEBUG(KERN_INFO, 0, | 553 | CIO_MSG_EVENT(4, "Subchannel 0.%x.%04x reports " |
571 | "Subchannel 0.%x.%04x reports " | 554 | "non-I/O subchannel type %04X\n", |
572 | "non-I/O subchannel type %04X\n", | 555 | sch->schid.ssid, sch->schid.sch_no, sch->st); |
573 | sch->schid.ssid, sch->schid.sch_no, sch->st); | ||
574 | /* We stop here for non-io subchannels. */ | 556 | /* We stop here for non-io subchannels. */ |
575 | err = sch->st; | 557 | err = sch->st; |
576 | goto out; | 558 | goto out; |
@@ -588,7 +570,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
588 | * This device must not be known to Linux. So we simply | 570 | * This device must not be known to Linux. So we simply |
589 | * say that there is no device and return ENODEV. | 571 | * say that there is no device and return ENODEV. |
590 | */ | 572 | */ |
591 | CIO_MSG_EVENT(4, "Blacklisted device detected " | 573 | CIO_MSG_EVENT(6, "Blacklisted device detected " |
592 | "at devno %04X, subchannel set %x\n", | 574 | "at devno %04X, subchannel set %x\n", |
593 | sch->schib.pmcw.dev, sch->schid.ssid); | 575 | sch->schib.pmcw.dev, sch->schid.ssid); |
594 | err = -ENODEV; | 576 | err = -ENODEV; |
@@ -601,12 +583,11 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
601 | sch->lpm = sch->schib.pmcw.pam & sch->opm; | 583 | sch->lpm = sch->schib.pmcw.pam & sch->opm; |
602 | sch->isc = 3; | 584 | sch->isc = 3; |
603 | 585 | ||
604 | CIO_DEBUG(KERN_INFO, 0, | 586 | CIO_MSG_EVENT(6, "Detected device %04x on subchannel 0.%x.%04X " |
605 | "Detected device %04x on subchannel 0.%x.%04X" | 587 | "- PIM = %02X, PAM = %02X, POM = %02X\n", |
606 | " - PIM = %02X, PAM = %02X, POM = %02X\n", | 588 | sch->schib.pmcw.dev, sch->schid.ssid, |
607 | sch->schib.pmcw.dev, sch->schid.ssid, | 589 | sch->schid.sch_no, sch->schib.pmcw.pim, |
608 | sch->schid.sch_no, sch->schib.pmcw.pim, | 590 | sch->schib.pmcw.pam, sch->schib.pmcw.pom); |
609 | sch->schib.pmcw.pam, sch->schib.pmcw.pom); | ||
610 | 591 | ||
611 | /* | 592 | /* |
612 | * We now have to initially ... | 593 | * We now have to initially ... |
diff --git a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h index 3c75412904dc..6e933aebe013 100644 --- a/drivers/s390/cio/cio.h +++ b/drivers/s390/cio/cio.h | |||
@@ -118,6 +118,4 @@ extern void *cio_get_console_priv(void); | |||
118 | #define cio_get_console_priv() NULL | 118 | #define cio_get_console_priv() NULL |
119 | #endif | 119 | #endif |
120 | 120 | ||
121 | extern int cio_show_msg; | ||
122 | |||
123 | #endif | 121 | #endif |
diff --git a/drivers/s390/cio/cio_debug.h b/drivers/s390/cio/cio_debug.h index d7429ef6c666..e64e8278c42e 100644 --- a/drivers/s390/cio/cio_debug.h +++ b/drivers/s390/cio/cio_debug.h | |||
@@ -31,10 +31,4 @@ static inline void CIO_HEX_EVENT(int level, void *data, int length) | |||
31 | } | 31 | } |
32 | } | 32 | } |
33 | 33 | ||
34 | #define CIO_DEBUG(printk_level, event_level, msg...) do { \ | ||
35 | if (cio_show_msg) \ | ||
36 | printk(printk_level "cio: " msg); \ | ||
37 | CIO_MSG_EVENT(event_level, msg); \ | ||
38 | } while (0) | ||
39 | |||
40 | #endif | 34 | #endif |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 595e327d2f76..a76956512b2d 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -570,7 +570,7 @@ static void reprobe_all(struct work_struct *unused) | |||
570 | { | 570 | { |
571 | int ret; | 571 | int ret; |
572 | 572 | ||
573 | CIO_MSG_EVENT(2, "reprobe start\n"); | 573 | CIO_MSG_EVENT(4, "reprobe start\n"); |
574 | 574 | ||
575 | need_reprobe = 0; | 575 | need_reprobe = 0; |
576 | /* Make sure initial subchannel scan is done. */ | 576 | /* Make sure initial subchannel scan is done. */ |
@@ -578,7 +578,7 @@ static void reprobe_all(struct work_struct *unused) | |||
578 | atomic_read(&ccw_device_init_count) == 0); | 578 | atomic_read(&ccw_device_init_count) == 0); |
579 | ret = for_each_subchannel_staged(NULL, reprobe_subchannel, NULL); | 579 | ret = for_each_subchannel_staged(NULL, reprobe_subchannel, NULL); |
580 | 580 | ||
581 | CIO_MSG_EVENT(2, "reprobe done (rc=%d, need_reprobe=%d)\n", ret, | 581 | CIO_MSG_EVENT(4, "reprobe done (rc=%d, need_reprobe=%d)\n", ret, |
582 | need_reprobe); | 582 | need_reprobe); |
583 | } | 583 | } |
584 | 584 | ||
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index abfd601d237a..e22813db74a2 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -341,7 +341,7 @@ ccw_device_remove_disconnected(struct ccw_device *cdev) | |||
341 | rc = device_schedule_callback(&cdev->dev, | 341 | rc = device_schedule_callback(&cdev->dev, |
342 | ccw_device_remove_orphan_cb); | 342 | ccw_device_remove_orphan_cb); |
343 | if (rc) | 343 | if (rc) |
344 | CIO_MSG_EVENT(2, "Couldn't unregister orphan " | 344 | CIO_MSG_EVENT(0, "Couldn't unregister orphan " |
345 | "0.%x.%04x\n", | 345 | "0.%x.%04x\n", |
346 | cdev->private->dev_id.ssid, | 346 | cdev->private->dev_id.ssid, |
347 | cdev->private->dev_id.devno); | 347 | cdev->private->dev_id.devno); |
@@ -351,7 +351,7 @@ ccw_device_remove_disconnected(struct ccw_device *cdev) | |||
351 | rc = device_schedule_callback(cdev->dev.parent, | 351 | rc = device_schedule_callback(cdev->dev.parent, |
352 | ccw_device_remove_sch_cb); | 352 | ccw_device_remove_sch_cb); |
353 | if (rc) | 353 | if (rc) |
354 | CIO_MSG_EVENT(2, "Couldn't unregister disconnected device " | 354 | CIO_MSG_EVENT(0, "Couldn't unregister disconnected device " |
355 | "0.%x.%04x\n", | 355 | "0.%x.%04x\n", |
356 | cdev->private->dev_id.ssid, | 356 | cdev->private->dev_id.ssid, |
357 | cdev->private->dev_id.devno); | 357 | cdev->private->dev_id.devno); |
@@ -397,7 +397,7 @@ int ccw_device_set_offline(struct ccw_device *cdev) | |||
397 | if (ret == 0) | 397 | if (ret == 0) |
398 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); | 398 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); |
399 | else { | 399 | else { |
400 | CIO_MSG_EVENT(2, "ccw_device_offline returned %d, " | 400 | CIO_MSG_EVENT(0, "ccw_device_offline returned %d, " |
401 | "device 0.%x.%04x\n", | 401 | "device 0.%x.%04x\n", |
402 | ret, cdev->private->dev_id.ssid, | 402 | ret, cdev->private->dev_id.ssid, |
403 | cdev->private->dev_id.devno); | 403 | cdev->private->dev_id.devno); |
@@ -433,7 +433,7 @@ int ccw_device_set_online(struct ccw_device *cdev) | |||
433 | if (ret == 0) | 433 | if (ret == 0) |
434 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); | 434 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); |
435 | else { | 435 | else { |
436 | CIO_MSG_EVENT(2, "ccw_device_online returned %d, " | 436 | CIO_MSG_EVENT(0, "ccw_device_online returned %d, " |
437 | "device 0.%x.%04x\n", | 437 | "device 0.%x.%04x\n", |
438 | ret, cdev->private->dev_id.ssid, | 438 | ret, cdev->private->dev_id.ssid, |
439 | cdev->private->dev_id.devno); | 439 | cdev->private->dev_id.devno); |
@@ -451,7 +451,7 @@ int ccw_device_set_online(struct ccw_device *cdev) | |||
451 | if (ret == 0) | 451 | if (ret == 0) |
452 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); | 452 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); |
453 | else | 453 | else |
454 | CIO_MSG_EVENT(2, "ccw_device_offline returned %d, " | 454 | CIO_MSG_EVENT(0, "ccw_device_offline returned %d, " |
455 | "device 0.%x.%04x\n", | 455 | "device 0.%x.%04x\n", |
456 | ret, cdev->private->dev_id.ssid, | 456 | ret, cdev->private->dev_id.ssid, |
457 | cdev->private->dev_id.devno); | 457 | cdev->private->dev_id.devno); |
@@ -803,7 +803,7 @@ static void sch_attach_disconnected_device(struct subchannel *sch, | |||
803 | other_sch = to_subchannel(get_device(cdev->dev.parent)); | 803 | other_sch = to_subchannel(get_device(cdev->dev.parent)); |
804 | ret = device_move(&cdev->dev, &sch->dev); | 804 | ret = device_move(&cdev->dev, &sch->dev); |
805 | if (ret) { | 805 | if (ret) { |
806 | CIO_MSG_EVENT(2, "Moving disconnected device 0.%x.%04x failed " | 806 | CIO_MSG_EVENT(0, "Moving disconnected device 0.%x.%04x failed " |
807 | "(ret=%d)!\n", cdev->private->dev_id.ssid, | 807 | "(ret=%d)!\n", cdev->private->dev_id.ssid, |
808 | cdev->private->dev_id.devno, ret); | 808 | cdev->private->dev_id.devno, ret); |
809 | put_device(&other_sch->dev); | 809 | put_device(&other_sch->dev); |
@@ -933,7 +933,7 @@ io_subchannel_register(struct work_struct *work) | |||
933 | ret = device_reprobe(&cdev->dev); | 933 | ret = device_reprobe(&cdev->dev); |
934 | if (ret) | 934 | if (ret) |
935 | /* We can't do much here. */ | 935 | /* We can't do much here. */ |
936 | CIO_MSG_EVENT(2, "device_reprobe() returned" | 936 | CIO_MSG_EVENT(0, "device_reprobe() returned" |
937 | " %d for 0.%x.%04x\n", ret, | 937 | " %d for 0.%x.%04x\n", ret, |
938 | cdev->private->dev_id.ssid, | 938 | cdev->private->dev_id.ssid, |
939 | cdev->private->dev_id.devno); | 939 | cdev->private->dev_id.devno); |
@@ -1086,7 +1086,7 @@ static void ccw_device_move_to_sch(struct work_struct *work) | |||
1086 | rc = device_move(&cdev->dev, &sch->dev); | 1086 | rc = device_move(&cdev->dev, &sch->dev); |
1087 | mutex_unlock(&sch->reg_mutex); | 1087 | mutex_unlock(&sch->reg_mutex); |
1088 | if (rc) { | 1088 | if (rc) { |
1089 | CIO_MSG_EVENT(2, "Moving device 0.%x.%04x to subchannel " | 1089 | CIO_MSG_EVENT(0, "Moving device 0.%x.%04x to subchannel " |
1090 | "0.%x.%04x failed (ret=%d)!\n", | 1090 | "0.%x.%04x failed (ret=%d)!\n", |
1091 | cdev->private->dev_id.ssid, | 1091 | cdev->private->dev_id.ssid, |
1092 | cdev->private->dev_id.devno, sch->schid.ssid, | 1092 | cdev->private->dev_id.devno, sch->schid.ssid, |
@@ -1446,8 +1446,7 @@ ccw_device_remove (struct device *dev) | |||
1446 | wait_event(cdev->private->wait_q, | 1446 | wait_event(cdev->private->wait_q, |
1447 | dev_fsm_final_state(cdev)); | 1447 | dev_fsm_final_state(cdev)); |
1448 | else | 1448 | else |
1449 | //FIXME: we can't fail! | 1449 | CIO_MSG_EVENT(0, "ccw_device_offline returned %d, " |
1450 | CIO_MSG_EVENT(2, "ccw_device_offline returned %d, " | ||
1451 | "device 0.%x.%04x\n", | 1450 | "device 0.%x.%04x\n", |
1452 | ret, cdev->private->dev_id.ssid, | 1451 | ret, cdev->private->dev_id.ssid, |
1453 | cdev->private->dev_id.devno); | 1452 | cdev->private->dev_id.devno); |
@@ -1524,7 +1523,7 @@ static int recovery_check(struct device *dev, void *data) | |||
1524 | spin_lock_irq(cdev->ccwlock); | 1523 | spin_lock_irq(cdev->ccwlock); |
1525 | switch (cdev->private->state) { | 1524 | switch (cdev->private->state) { |
1526 | case DEV_STATE_DISCONNECTED: | 1525 | case DEV_STATE_DISCONNECTED: |
1527 | CIO_MSG_EVENT(3, "recovery: trigger 0.%x.%04x\n", | 1526 | CIO_MSG_EVENT(4, "recovery: trigger 0.%x.%04x\n", |
1528 | cdev->private->dev_id.ssid, | 1527 | cdev->private->dev_id.ssid, |
1529 | cdev->private->dev_id.devno); | 1528 | cdev->private->dev_id.devno); |
1530 | dev_fsm_event(cdev, DEV_EVENT_VERIFY); | 1529 | dev_fsm_event(cdev, DEV_EVENT_VERIFY); |
@@ -1554,7 +1553,7 @@ static void recovery_work_func(struct work_struct *unused) | |||
1554 | } | 1553 | } |
1555 | spin_unlock_irq(&recovery_lock); | 1554 | spin_unlock_irq(&recovery_lock); |
1556 | } else | 1555 | } else |
1557 | CIO_MSG_EVENT(2, "recovery: end\n"); | 1556 | CIO_MSG_EVENT(4, "recovery: end\n"); |
1558 | } | 1557 | } |
1559 | 1558 | ||
1560 | static DECLARE_WORK(recovery_work, recovery_work_func); | 1559 | static DECLARE_WORK(recovery_work, recovery_work_func); |
@@ -1572,7 +1571,7 @@ void ccw_device_schedule_recovery(void) | |||
1572 | { | 1571 | { |
1573 | unsigned long flags; | 1572 | unsigned long flags; |
1574 | 1573 | ||
1575 | CIO_MSG_EVENT(2, "recovery: schedule\n"); | 1574 | CIO_MSG_EVENT(4, "recovery: schedule\n"); |
1576 | spin_lock_irqsave(&recovery_lock, flags); | 1575 | spin_lock_irqsave(&recovery_lock, flags); |
1577 | if (!timer_pending(&recovery_timer) || (recovery_phase != 0)) { | 1576 | if (!timer_pending(&recovery_timer) || (recovery_phase != 0)) { |
1578 | recovery_phase = 0; | 1577 | recovery_phase = 0; |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 99403b0a97a7..e268d5a77c12 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -322,10 +322,10 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) | |||
322 | same_dev = 0; /* Keep the compiler quiet... */ | 322 | same_dev = 0; /* Keep the compiler quiet... */ |
323 | switch (state) { | 323 | switch (state) { |
324 | case DEV_STATE_NOT_OPER: | 324 | case DEV_STATE_NOT_OPER: |
325 | CIO_DEBUG(KERN_WARNING, 2, | 325 | CIO_MSG_EVENT(2, "SenseID : unknown device %04x on " |
326 | "SenseID : unknown device %04x on subchannel " | 326 | "subchannel 0.%x.%04x\n", |
327 | "0.%x.%04x\n", cdev->private->dev_id.devno, | 327 | cdev->private->dev_id.devno, |
328 | sch->schid.ssid, sch->schid.sch_no); | 328 | sch->schid.ssid, sch->schid.sch_no); |
329 | break; | 329 | break; |
330 | case DEV_STATE_OFFLINE: | 330 | case DEV_STATE_OFFLINE: |
331 | if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID) { | 331 | if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID) { |
@@ -348,20 +348,19 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) | |||
348 | return; | 348 | return; |
349 | } | 349 | } |
350 | /* Issue device info message. */ | 350 | /* Issue device info message. */ |
351 | CIO_DEBUG(KERN_INFO, 2, | 351 | CIO_MSG_EVENT(4, "SenseID : device 0.%x.%04x reports: " |
352 | "SenseID : device 0.%x.%04x reports: " | 352 | "CU Type/Mod = %04X/%02X, Dev Type/Mod = " |
353 | "CU Type/Mod = %04X/%02X, Dev Type/Mod = " | 353 | "%04X/%02X\n", |
354 | "%04X/%02X\n", | 354 | cdev->private->dev_id.ssid, |
355 | cdev->private->dev_id.ssid, | 355 | cdev->private->dev_id.devno, |
356 | cdev->private->dev_id.devno, | 356 | cdev->id.cu_type, cdev->id.cu_model, |
357 | cdev->id.cu_type, cdev->id.cu_model, | 357 | cdev->id.dev_type, cdev->id.dev_model); |
358 | cdev->id.dev_type, cdev->id.dev_model); | ||
359 | break; | 358 | break; |
360 | case DEV_STATE_BOXED: | 359 | case DEV_STATE_BOXED: |
361 | CIO_DEBUG(KERN_WARNING, 2, | 360 | CIO_MSG_EVENT(0, "SenseID : boxed device %04x on " |
362 | "SenseID : boxed device %04x on subchannel " | 361 | " subchannel 0.%x.%04x\n", |
363 | "0.%x.%04x\n", cdev->private->dev_id.devno, | 362 | cdev->private->dev_id.devno, |
364 | sch->schid.ssid, sch->schid.sch_no); | 363 | sch->schid.ssid, sch->schid.sch_no); |
365 | break; | 364 | break; |
366 | } | 365 | } |
367 | cdev->private->state = state; | 366 | cdev->private->state = state; |
@@ -443,9 +442,8 @@ ccw_device_done(struct ccw_device *cdev, int state) | |||
443 | 442 | ||
444 | 443 | ||
445 | if (state == DEV_STATE_BOXED) | 444 | if (state == DEV_STATE_BOXED) |
446 | CIO_DEBUG(KERN_WARNING, 2, | 445 | CIO_MSG_EVENT(0, "Boxed device %04x on subchannel %04x\n", |
447 | "Boxed device %04x on subchannel %04x\n", | 446 | cdev->private->dev_id.devno, sch->schid.sch_no); |
448 | cdev->private->dev_id.devno, sch->schid.sch_no); | ||
449 | 447 | ||
450 | if (cdev->private->flags.donotify) { | 448 | if (cdev->private->flags.donotify) { |
451 | cdev->private->flags.donotify = 0; | 449 | cdev->private->flags.donotify = 0; |
@@ -900,7 +898,7 @@ ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event) | |||
900 | /* Basic sense hasn't started. Try again. */ | 898 | /* Basic sense hasn't started. Try again. */ |
901 | ccw_device_do_sense(cdev, irb); | 899 | ccw_device_do_sense(cdev, irb); |
902 | else { | 900 | else { |
903 | CIO_MSG_EVENT(2, "Huh? 0.%x.%04x: unsolicited " | 901 | CIO_MSG_EVENT(0, "0.%x.%04x: unsolicited " |
904 | "interrupt during w4sense...\n", | 902 | "interrupt during w4sense...\n", |
905 | cdev->private->dev_id.ssid, | 903 | cdev->private->dev_id.ssid, |
906 | cdev->private->dev_id.devno); | 904 | cdev->private->dev_id.devno); |
@@ -1169,8 +1167,10 @@ ccw_device_nop(struct ccw_device *cdev, enum dev_event dev_event) | |||
1169 | static void | 1167 | static void |
1170 | ccw_device_bug(struct ccw_device *cdev, enum dev_event dev_event) | 1168 | ccw_device_bug(struct ccw_device *cdev, enum dev_event dev_event) |
1171 | { | 1169 | { |
1172 | CIO_MSG_EVENT(0, "dev_jumptable[%i][%i] == NULL\n", | 1170 | CIO_MSG_EVENT(0, "Internal state [%i][%i] not handled for device " |
1173 | cdev->private->state, dev_event); | 1171 | "0.%x.%04x\n", cdev->private->state, dev_event, |
1172 | cdev->private->dev_id.ssid, | ||
1173 | cdev->private->dev_id.devno); | ||
1174 | BUG(); | 1174 | BUG(); |
1175 | } | 1175 | } |
1176 | 1176 | ||
diff --git a/drivers/s390/cio/device_id.c b/drivers/s390/cio/device_id.c index dc4d87f77f6c..cba7020517ed 100644 --- a/drivers/s390/cio/device_id.c +++ b/drivers/s390/cio/device_id.c | |||
@@ -214,7 +214,7 @@ ccw_device_check_sense_id(struct ccw_device *cdev) | |||
214 | * sense id information. So, for intervention required, | 214 | * sense id information. So, for intervention required, |
215 | * we use the "whack it until it talks" strategy... | 215 | * we use the "whack it until it talks" strategy... |
216 | */ | 216 | */ |
217 | CIO_MSG_EVENT(2, "SenseID : device %04x on Subchannel " | 217 | CIO_MSG_EVENT(0, "SenseID : device %04x on Subchannel " |
218 | "0.%x.%04x reports cmd reject\n", | 218 | "0.%x.%04x reports cmd reject\n", |
219 | cdev->private->dev_id.devno, sch->schid.ssid, | 219 | cdev->private->dev_id.devno, sch->schid.ssid, |
220 | sch->schid.sch_no); | 220 | sch->schid.sch_no); |
@@ -239,7 +239,7 @@ ccw_device_check_sense_id(struct ccw_device *cdev) | |||
239 | 239 | ||
240 | lpm = to_io_private(sch)->orb.lpm; | 240 | lpm = to_io_private(sch)->orb.lpm; |
241 | if ((lpm & sch->schib.pmcw.pim & sch->schib.pmcw.pam) != 0) | 241 | if ((lpm & sch->schib.pmcw.pim & sch->schib.pmcw.pam) != 0) |
242 | CIO_MSG_EVENT(2, "SenseID : path %02X for device %04x " | 242 | CIO_MSG_EVENT(4, "SenseID : path %02X for device %04x " |
243 | "on subchannel 0.%x.%04x is " | 243 | "on subchannel 0.%x.%04x is " |
244 | "'not operational'\n", lpm, | 244 | "'not operational'\n", lpm, |
245 | cdev->private->dev_id.devno, | 245 | cdev->private->dev_id.devno, |
diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c index c52449a1f9fc..5cf7be008e98 100644 --- a/drivers/s390/cio/device_pgid.c +++ b/drivers/s390/cio/device_pgid.c | |||
@@ -79,7 +79,7 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) | |||
79 | /* ret is 0, -EBUSY, -EACCES or -ENODEV */ | 79 | /* ret is 0, -EBUSY, -EACCES or -ENODEV */ |
80 | if (ret != -EACCES) | 80 | if (ret != -EACCES) |
81 | return ret; | 81 | return ret; |
82 | CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel " | 82 | CIO_MSG_EVENT(3, "SNID - Device %04x on Subchannel " |
83 | "0.%x.%04x, lpm %02X, became 'not " | 83 | "0.%x.%04x, lpm %02X, became 'not " |
84 | "operational'\n", | 84 | "operational'\n", |
85 | cdev->private->dev_id.devno, | 85 | cdev->private->dev_id.devno, |
@@ -159,7 +159,7 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev) | |||
159 | u8 lpm; | 159 | u8 lpm; |
160 | 160 | ||
161 | lpm = to_io_private(sch)->orb.lpm; | 161 | lpm = to_io_private(sch)->orb.lpm; |
162 | CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x," | 162 | CIO_MSG_EVENT(3, "SNID - Device %04x on Subchannel 0.%x.%04x," |
163 | " lpm %02X, became 'not operational'\n", | 163 | " lpm %02X, became 'not operational'\n", |
164 | cdev->private->dev_id.devno, sch->schid.ssid, | 164 | cdev->private->dev_id.devno, sch->schid.ssid, |
165 | sch->schid.sch_no, lpm); | 165 | sch->schid.sch_no, lpm); |
@@ -243,16 +243,10 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func) | |||
243 | /* Setup sense path group id channel program. */ | 243 | /* Setup sense path group id channel program. */ |
244 | cdev->private->pgid[0].inf.fc = func; | 244 | cdev->private->pgid[0].inf.fc = func; |
245 | ccw = cdev->private->iccws; | 245 | ccw = cdev->private->iccws; |
246 | if (!cdev->private->flags.pgid_single) { | 246 | if (cdev->private->flags.pgid_single) |
247 | cdev->private->pgid[0].inf.fc |= SPID_FUNC_MULTI_PATH; | ||
248 | ccw->cmd_code = CCW_CMD_SUSPEND_RECONN; | ||
249 | ccw->cda = 0; | ||
250 | ccw->count = 0; | ||
251 | ccw->flags = CCW_FLAG_SLI | CCW_FLAG_CC; | ||
252 | ccw++; | ||
253 | } else | ||
254 | cdev->private->pgid[0].inf.fc |= SPID_FUNC_SINGLE_PATH; | 247 | cdev->private->pgid[0].inf.fc |= SPID_FUNC_SINGLE_PATH; |
255 | 248 | else | |
249 | cdev->private->pgid[0].inf.fc |= SPID_FUNC_MULTI_PATH; | ||
256 | ccw->cmd_code = CCW_CMD_SET_PGID; | 250 | ccw->cmd_code = CCW_CMD_SET_PGID; |
257 | ccw->cda = (__u32) __pa (&cdev->private->pgid[0]); | 251 | ccw->cda = (__u32) __pa (&cdev->private->pgid[0]); |
258 | ccw->count = sizeof (struct pgid); | 252 | ccw->count = sizeof (struct pgid); |
@@ -275,7 +269,7 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func) | |||
275 | return ret; | 269 | return ret; |
276 | } | 270 | } |
277 | /* PGID command failed on this path. */ | 271 | /* PGID command failed on this path. */ |
278 | CIO_MSG_EVENT(2, "SPID - Device %04x on Subchannel " | 272 | CIO_MSG_EVENT(3, "SPID - Device %04x on Subchannel " |
279 | "0.%x.%04x, lpm %02X, became 'not operational'\n", | 273 | "0.%x.%04x, lpm %02X, became 'not operational'\n", |
280 | cdev->private->dev_id.devno, sch->schid.ssid, | 274 | cdev->private->dev_id.devno, sch->schid.ssid, |
281 | sch->schid.sch_no, cdev->private->imask); | 275 | sch->schid.sch_no, cdev->private->imask); |
@@ -317,7 +311,7 @@ static int __ccw_device_do_nop(struct ccw_device *cdev) | |||
317 | return ret; | 311 | return ret; |
318 | } | 312 | } |
319 | /* nop command failed on this path. */ | 313 | /* nop command failed on this path. */ |
320 | CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel " | 314 | CIO_MSG_EVENT(3, "NOP - Device %04x on Subchannel " |
321 | "0.%x.%04x, lpm %02X, became 'not operational'\n", | 315 | "0.%x.%04x, lpm %02X, became 'not operational'\n", |
322 | cdev->private->dev_id.devno, sch->schid.ssid, | 316 | cdev->private->dev_id.devno, sch->schid.ssid, |
323 | sch->schid.sch_no, cdev->private->imask); | 317 | sch->schid.sch_no, cdev->private->imask); |
@@ -362,7 +356,7 @@ __ccw_device_check_pgid(struct ccw_device *cdev) | |||
362 | return -EAGAIN; | 356 | return -EAGAIN; |
363 | } | 357 | } |
364 | if (irb->scsw.cc == 3) { | 358 | if (irb->scsw.cc == 3) { |
365 | CIO_MSG_EVENT(2, "SPID - Device %04x on Subchannel 0.%x.%04x," | 359 | CIO_MSG_EVENT(3, "SPID - Device %04x on Subchannel 0.%x.%04x," |
366 | " lpm %02X, became 'not operational'\n", | 360 | " lpm %02X, became 'not operational'\n", |
367 | cdev->private->dev_id.devno, sch->schid.ssid, | 361 | cdev->private->dev_id.devno, sch->schid.ssid, |
368 | sch->schid.sch_no, cdev->private->imask); | 362 | sch->schid.sch_no, cdev->private->imask); |
@@ -391,7 +385,7 @@ static int __ccw_device_check_nop(struct ccw_device *cdev) | |||
391 | return -ETIME; | 385 | return -ETIME; |
392 | } | 386 | } |
393 | if (irb->scsw.cc == 3) { | 387 | if (irb->scsw.cc == 3) { |
394 | CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel 0.%x.%04x," | 388 | CIO_MSG_EVENT(3, "NOP - Device %04x on Subchannel 0.%x.%04x," |
395 | " lpm %02X, became 'not operational'\n", | 389 | " lpm %02X, became 'not operational'\n", |
396 | cdev->private->dev_id.devno, sch->schid.ssid, | 390 | cdev->private->dev_id.devno, sch->schid.ssid, |
397 | sch->schid.sch_no, cdev->private->imask); | 391 | sch->schid.sch_no, cdev->private->imask); |
diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c index 47a7e6200b26..9f55ce6f3c78 100644 --- a/drivers/s390/kvm/kvm_virtio.c +++ b/drivers/s390/kvm/kvm_virtio.c | |||
@@ -78,27 +78,32 @@ static unsigned desc_size(const struct kvm_device_desc *desc) | |||
78 | + desc->config_len; | 78 | + desc->config_len; |
79 | } | 79 | } |
80 | 80 | ||
81 | /* | 81 | /* This gets the device's feature bits. */ |
82 | * This tests (and acknowleges) a feature bit. | 82 | static u32 kvm_get_features(struct virtio_device *vdev) |
83 | */ | ||
84 | static bool kvm_feature(struct virtio_device *vdev, unsigned fbit) | ||
85 | { | 83 | { |
84 | unsigned int i; | ||
85 | u32 features = 0; | ||
86 | struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; | 86 | struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; |
87 | u8 *features; | 87 | u8 *in_features = kvm_vq_features(desc); |
88 | 88 | ||
89 | if (fbit / 8 > desc->feature_len) | 89 | for (i = 0; i < min(desc->feature_len * 8, 32); i++) |
90 | return false; | 90 | if (in_features[i / 8] & (1 << (i % 8))) |
91 | features |= (1 << i); | ||
92 | return features; | ||
93 | } | ||
91 | 94 | ||
92 | features = kvm_vq_features(desc); | 95 | static void kvm_set_features(struct virtio_device *vdev, u32 features) |
93 | if (!(features[fbit / 8] & (1 << (fbit % 8)))) | 96 | { |
94 | return false; | 97 | unsigned int i; |
98 | struct kvm_device_desc *desc = to_kvmdev(vdev)->desc; | ||
99 | /* Second half of bitmap is features we accept. */ | ||
100 | u8 *out_features = kvm_vq_features(desc) + desc->feature_len; | ||
95 | 101 | ||
96 | /* | 102 | memset(out_features, 0, desc->feature_len); |
97 | * We set the matching bit in the other half of the bitmap to tell the | 103 | for (i = 0; i < min(desc->feature_len * 8, 32); i++) { |
98 | * Host we want to use this feature. | 104 | if (features & (1 << i)) |
99 | */ | 105 | out_features[i / 8] |= (1 << (i % 8)); |
100 | features[desc->feature_len + fbit / 8] |= (1 << (fbit % 8)); | 106 | } |
101 | return true; | ||
102 | } | 107 | } |
103 | 108 | ||
104 | /* | 109 | /* |
@@ -221,7 +226,8 @@ static void kvm_del_vq(struct virtqueue *vq) | |||
221 | * The config ops structure as defined by virtio config | 226 | * The config ops structure as defined by virtio config |
222 | */ | 227 | */ |
223 | static struct virtio_config_ops kvm_vq_configspace_ops = { | 228 | static struct virtio_config_ops kvm_vq_configspace_ops = { |
224 | .feature = kvm_feature, | 229 | .get_features = kvm_get_features, |
230 | .set_features = kvm_set_features, | ||
225 | .get = kvm_get, | 231 | .get = kvm_get, |
226 | .set = kvm_set, | 232 | .set = kvm_set, |
227 | .get_status = kvm_get_status, | 233 | .get_status = kvm_get_status, |
diff --git a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c index 4d4b54277c43..5080f343ad74 100644 --- a/drivers/s390/s390mach.c +++ b/drivers/s390/s390mach.c | |||
@@ -48,10 +48,11 @@ s390_collect_crw_info(void *param) | |||
48 | int ccode; | 48 | int ccode; |
49 | struct semaphore *sem; | 49 | struct semaphore *sem; |
50 | unsigned int chain; | 50 | unsigned int chain; |
51 | int ignore; | ||
51 | 52 | ||
52 | sem = (struct semaphore *)param; | 53 | sem = (struct semaphore *)param; |
53 | repeat: | 54 | repeat: |
54 | down_interruptible(sem); | 55 | ignore = down_interruptible(sem); |
55 | chain = 0; | 56 | chain = 0; |
56 | while (1) { | 57 | while (1) { |
57 | if (unlikely(chain > 1)) { | 58 | if (unlikely(chain > 1)) { |