patch-2.2.19 linux/drivers/s390/char/hwc_rw.c
Next file: linux/drivers/s390/char/hwc_rw.h
Previous file: linux/drivers/s390/char/hwc.h
Back to the patch index
Back to the overall index
- Lines: 836
- Date:
Sun Mar 25 11:37:35 2001
- Orig file:
v2.2.18/drivers/s390/char/hwc_rw.c
- Orig date:
Sun Mar 25 11:28:27 2001
diff -u --new-file --recursive --exclude-from /usr/src/exclude v2.2.18/drivers/s390/char/hwc_rw.c linux/drivers/s390/char/hwc_rw.c
@@ -29,9 +29,13 @@
#include <asm/s390_ext.h>
#ifndef MIN
-#define MIN(a,b) ((a<b) ? a : b)
+#define MIN(a,b) (((a<b) ? a : b))
#endif
+#define HWC_ASCEBC(x) ((MACHINE_IS_VM ? _ascebc[x] : _ascebc_500[x]))
+
+#define HWC_EBCASC_STR(s,c) ((MACHINE_IS_VM ? EBCASC(s,c) : EBCASC_500(s,c)))
+
#define HWC_RW_PRINT_HEADER "hwc low level driver: "
#define USE_VM_DETECTION
@@ -50,7 +54,7 @@
#undef BUFFER_STRESS_TEST
-#define MEASURE_HWC_OUTPUT
+#undef MEASURE_HWC_OUTPUT
typedef struct {
unsigned char *next;
@@ -119,15 +123,16 @@
static unsigned char
_page[PAGE_SIZE] __attribute__ ((aligned (PAGE_SIZE)));
-typedef u32 kmem_pages_t;
+typedef unsigned long kmem_pages_t;
#define MAX_KMEM_PAGES (sizeof(kmem_pages_t) << 3)
-#define HWC_TIMER_RUNS 1
-#define HWC_FLUSH 2
-#define HWC_INIT 4
-#define HWC_BROKEN 8
-#define HWC_INTERRUPT 16
+#define HWC_WTIMER_RUNS 1
+#define HWC_FLUSH 2
+#define HWC_INIT 4
+#define HWC_BROKEN 8
+#define HWC_INTERRUPT 16
+#define HWC_PTIMER_RUNS 32
static struct {
@@ -169,6 +174,7 @@
unsigned char write_prio:1;
unsigned char read_nonprio:1;
unsigned char read_prio:1;
+ unsigned char read_statechange:1;
unsigned char flags;
@@ -177,6 +183,8 @@
spinlock_t lock;
struct timer_list write_timer;
+
+ struct timer_list poll_timer;
} hwc_data =
{
{
@@ -185,7 +193,6 @@
8,
0,
80,
- CODE_ASCII,
1,
50,
MAX_KMEM_PAGES,
@@ -218,6 +225,7 @@
0,
0,
0,
+ 0,
NULL
};
@@ -231,7 +239,6 @@
static signed int do_hwc_write (int from_user, unsigned char *,
unsigned int,
- unsigned char,
unsigned char);
static asmlinkage int
@@ -244,7 +251,7 @@
va_start (args, fmt);
i = vsprintf (buf, fmt, args);
va_end (args);
- return do_hwc_write (0, buf, i, CODE_ASCII, write_time);
+ return do_hwc_write (0, buf, i, write_time);
}
int
@@ -260,7 +267,7 @@
i = vsprintf (buf, fmt, args);
va_end (args);
- retval = do_hwc_write (0, buf, i, CODE_ASCII, IMMEDIATE_WRITE);
+ retval = do_hwc_write (0, buf, i, IMMEDIATE_WRITE);
spin_unlock_irqrestore (&hwc_data.lock, flags);
@@ -310,8 +317,8 @@
{
unsigned int condition_code = 1;
- __asm__ __volatile__ ("L 1, 0(0,%0) \n\t"
- "LRA 2, 0(0,%1) \n\t"
+ __asm__ __volatile__ ("L 1, 0(%0) \n\t"
+ "LRA 2, 0(%1) \n\t"
".long 0xB2200012 \n\t"
:
:"a" (&hwc_command_word), "a" (hwcb)
@@ -329,7 +336,7 @@
{
u32 param;
- __asm__ __volatile__ ("L %0,128(0,0)\n\t"
+ __asm__ __volatile__ ("L %0,128\n\t"
:"=r" (param));
return ((unsigned char *) param);
@@ -350,9 +357,6 @@
memcpy (hwcb, &write_hwcb_template, sizeof (write_hwcb_t));
- if (!hwc_data.write_nonprio && hwc_data.write_prio)
- hwcb->msgbuf.type = ET_PMsgCmd;
-
return 0;
}
@@ -375,7 +379,7 @@
#ifdef DUMP_HWC_WRITE_LIST_ERROR
__asm__ ("LHI 1,0xe30\n\t"
- "LRA 2,0(0,%0) \n\t"
+ "LRA 2,0(%0) \n\t"
"J .+0 \n\t"
:
: "a" (bad_addr)
@@ -437,8 +441,8 @@
if (hwc_data.hwcb_count < 2)
#ifdef DUMP_HWC_WRITE_LIST_ERROR
__asm__ ("LHI 1,0xe31\n\t"
- "LRA 2,0(0,%0)\n\t"
- "LRA 3,0(0,%1)\n\t"
+ "LRA 2,0(%0)\n\t"
+ "LRA 3,0(%1)\n\t"
"J .+0 \n\t"
:
: "a" (BUF_HWCB), "a" (OUT_HWCB)
@@ -658,32 +662,65 @@
return count;
}
+static int write_event_data_1 (void);
+
+static void
+do_poll_hwc (unsigned long data)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave (&hwc_data.lock, flags);
+
+ write_event_data_1 ();
+
+ spin_unlock_irqrestore (&hwc_data.lock, flags);
+}
+
+void
+start_poll_hwc (void)
+{
+ init_timer (&hwc_data.poll_timer);
+ hwc_data.poll_timer.function = do_poll_hwc;
+ hwc_data.poll_timer.data = (unsigned long) NULL;
+ hwc_data.poll_timer.expires = jiffies + 2 * HZ;
+ add_timer (&hwc_data.poll_timer);
+ hwc_data.flags |= HWC_PTIMER_RUNS;
+}
+
static int
write_event_data_1 (void)
{
unsigned short int condition_code;
int retval;
+ write_hwcb_t *hwcb = (write_hwcb_t *) OUT_HWCB;
- if ((!hwc_data.write_prio) && (!hwc_data.write_nonprio))
- return -EPERM;
+ if ((!hwc_data.write_prio) &&
+ (!hwc_data.write_nonprio) &&
+ hwc_data.read_statechange)
+ return -EOPNOTSUPP;
if (hwc_data.current_servc)
return -EBUSY;
retval = sane_write_hwcb ();
if (retval < 0)
- return retval;
+ return -EIO;
if (!OUT_HWCB_MTO)
return -ENODATA;
+ if (!hwc_data.write_nonprio && hwc_data.write_prio)
+ hwcb->msgbuf.type = ET_PMsgCmd;
+ else
+ hwcb->msgbuf.type = ET_Msg;
+
condition_code = service_call (HWC_CMDW_WRITEDATA, OUT_HWCB);
#ifdef DUMP_HWC_WRITE_ERROR
if (condition_code != HWC_COMMAND_INITIATED)
__asm__ ("LHI 1,0xe20\n\t"
- "L 2,0(0,%0)\n\t"
- "LRA 3,0(0,%1)\n\t"
+ "L 2,0(%0)\n\t"
+ "LRA 3,0(%1)\n\t"
"J .+0 \n\t"
:
: "a" (&condition_code), "a" (OUT_HWCB)
@@ -702,6 +739,8 @@
case HWC_BUSY:
retval = -EBUSY;
break;
+ case HWC_NOT_OPERATIONAL:
+ start_poll_hwc ();
default:
retval = -EIO;
}
@@ -724,7 +763,7 @@
write_event_data_2 (void)
{
write_hwcb_t *hwcb;
- int retval;
+ int retval = 0;
#ifdef DUMP_HWC_WRITE_ERROR
unsigned char *param;
@@ -734,7 +773,7 @@
internal_print (
DELAYED_WRITE,
HWC_RW_PRINT_HEADER
- "write_event_mask_2 : "
+ "write_event_data_2 : "
"HWCB address does not fit "
"(expected: 0x%x, got: 0x%x).\n",
hwc_data.current_hwcb,
@@ -748,10 +787,10 @@
#ifdef DUMP_HWC_WRITE_LIST_ERROR
if (((unsigned char *) hwcb) != hwc_data.current_hwcb) {
__asm__ ("LHI 1,0xe22\n\t"
- "LRA 2,0(0,%0)\n\t"
- "LRA 3,0(0,%1)\n\t"
- "LRA 4,0(0,%2)\n\t"
- "LRA 5,0(0,%3)\n\t"
+ "LRA 2,0(%0)\n\t"
+ "LRA 3,0(%1)\n\t"
+ "LRA 4,0(%2)\n\t"
+ "LRA 5,0(%3)\n\t"
"J .+0 \n\t"
:
: "a" (OUT_HWCB),
@@ -765,11 +804,11 @@
#ifdef DUMP_HWC_WRITE_ERROR
if (hwcb->response_code != 0x0020) {
__asm__ ("LHI 1,0xe21\n\t"
- "LRA 2,0(0,%0)\n\t"
- "LRA 3,0(0,%1)\n\t"
- "LRA 4,0(0,%2)\n\t"
- "LH 5,0(0,%3)\n\t"
- "SRL 5,8(0)\n\t"
+ "LRA 2,0(%0)\n\t"
+ "LRA 3,0(%1)\n\t"
+ "LRA 4,0(%2)\n\t"
+ "LH 5,0(%3)\n\t"
+ "SRL 5,8\n\t"
"J .+0 \n\t"
:
: "a" (OUT_HWCB), "a" (hwc_data.current_hwcb),
@@ -779,11 +818,22 @@
}
#endif
- if (hwcb->response_code == 0x0020) {
+ switch (hwcb->response_code) {
+ case 0x0020:
retval = OUT_HWCB_CHAR;
release_write_hwcb ();
- } else {
+ break;
+ case 0x0040:
+ case 0x0340:
+ case 0x40F0:
+ if (!hwc_data.read_statechange) {
+ hwcb->response_code = 0;
+ start_poll_hwc ();
+ }
+ retval = -EIO;
+ break;
+ default:
internal_print (
DELAYED_WRITE,
HWC_RW_PRINT_HEADER
@@ -796,6 +846,13 @@
retval = -EIO;
}
+ if (retval == -EIO) {
+
+ hwcb->control_mask[0] = 0;
+ hwcb->control_mask[1] = 0;
+ hwcb->control_mask[2] = 0;
+ hwcb->response_code = 0;
+ }
hwc_data.current_servc = 0;
hwc_data.current_hwcb = NULL;
@@ -819,10 +876,10 @@
#ifdef DUMP_HWC_WRITE_LIST_ERROR
if (add_mto (message, count) != count)
__asm__ ("LHI 1,0xe32\n\t"
- "LRA 2,0(0,%0)\n\t"
- "L 3,0(0,%1)\n\t"
- "LRA 4,0(0,%2)\n\t"
- "LRA 5,0(0,%3)\n\t"
+ "LRA 2,0(%0)\n\t"
+ "L 3,0(%1)\n\t"
+ "LRA 4,0(%2)\n\t"
+ "LRA 5,0(%3)\n\t"
"J .+0 \n\t"
:
: "a" (message), "a" (&hwc_data.kmem_pages),
@@ -840,9 +897,9 @@
unsigned short count)
{
- if ((!hwc_data.obuf_start) && (hwc_data.flags & HWC_TIMER_RUNS)) {
+ if ((!hwc_data.obuf_start) && (hwc_data.flags & HWC_WTIMER_RUNS)) {
del_timer (&hwc_data.write_timer);
- hwc_data.flags &= ~HWC_TIMER_RUNS;
+ hwc_data.flags &= ~HWC_WTIMER_RUNS;
}
hwc_data.obuf_start += count;
@@ -888,13 +945,12 @@
int from_user,
unsigned char *msg,
unsigned int count,
- unsigned char code,
unsigned char write_time)
{
unsigned int i_msg = 0;
unsigned short int spaces = 0;
unsigned int processed_characters = 0;
- unsigned char ch, orig_ch;
+ unsigned char ch;
unsigned short int obuf_count;
unsigned short int obuf_cursor;
unsigned short int obuf_columns;
@@ -911,15 +967,10 @@
}
for (i_msg = 0; i_msg < count; i_msg++) {
-
if (from_user)
- get_user (orig_ch, msg + i_msg);
+ get_user (ch, msg + i_msg);
else
- orig_ch = msg[i_msg];
- if (code == CODE_EBCDIC)
- ch = (MACHINE_IS_VM ? _ebcasc[orig_ch] : _ebcasc_500[orig_ch]);
- else
- ch = orig_ch;
+ ch = msg[i_msg];
processed_characters++;
@@ -957,7 +1008,7 @@
if (obuf_cursor < obuf_columns) {
hwc_data.obuf[hwc_data.obuf_start +
obuf_cursor]
- = 0x20;
+ = HWC_ASCEBC (' ');
obuf_cursor++;
} else
break;
@@ -975,7 +1026,7 @@
while (spaces) {
hwc_data.obuf[hwc_data.obuf_start +
obuf_cursor - spaces]
- = 0x20;
+ = HWC_ASCEBC (' ');
spaces--;
}
@@ -1005,11 +1056,7 @@
if (isprint (ch))
hwc_data.obuf[hwc_data.obuf_start +
obuf_cursor++]
- = (code == CODE_ASCII) ?
- (MACHINE_IS_VM ?
- _ascebc[orig_ch] :
- _ascebc_500[orig_ch]) :
- orig_ch;
+ = HWC_ASCEBC (ch);
}
if (obuf_cursor > obuf_count)
obuf_count = obuf_cursor;
@@ -1028,11 +1075,10 @@
if (hwc_data.ioctls.final_nl > 0) {
- if (hwc_data.flags & HWC_TIMER_RUNS) {
+ if (hwc_data.flags & HWC_WTIMER_RUNS) {
- hwc_data.write_timer.expires =
- jiffies +
- hwc_data.ioctls.final_nl * HZ / 10;
+ mod_timer (&hwc_data.write_timer,
+ jiffies + hwc_data.ioctls.final_nl * HZ / 10);
} else {
init_timer (&hwc_data.write_timer);
@@ -1044,7 +1090,7 @@
jiffies +
hwc_data.ioctls.final_nl * HZ / 10;
add_timer (&hwc_data.write_timer);
- hwc_data.flags |= HWC_TIMER_RUNS;
+ hwc_data.flags |= HWC_WTIMER_RUNS;
}
} else;
@@ -1072,8 +1118,7 @@
spin_lock_irqsave (&hwc_data.lock, flags);
retval = do_hwc_write (from_user, (unsigned char *) msg,
- count, hwc_data.ioctls.code,
- IMMEDIATE_WRITE);
+ count, IMMEDIATE_WRITE);
spin_unlock_irqrestore (&hwc_data.lock, flags);
@@ -1329,15 +1374,11 @@
if (hwc_data.ioctls.delim)
count = seperate_cases (start, count);
+ HWC_EBCASC_STR (start, count);
+
if (hwc_data.ioctls.echo)
- do_hwc_write (0, start, count, CODE_EBCDIC, IMMEDIATE_WRITE);
+ do_hwc_write (0, start, count, IMMEDIATE_WRITE);
- if (hwc_data.ioctls.code == CODE_ASCII) {
- if (MACHINE_IS_VM)
- EBCASC (start, count);
- else
- EBCASC_500 (start, count);
- }
if (hwc_data.calls != NULL)
if (hwc_data.calls->move_input != NULL)
(hwc_data.calls->move_input) (start, count);
@@ -1440,7 +1481,7 @@
return retval;
}
-inline static int
+static int
eval_evbuf (gds_vector_t * start, void *end)
{
gds_vector_t *vec;
@@ -1458,6 +1499,128 @@
return retval;
}
+static inline int
+eval_hwc_receive_mask (_hwcb_mask_t mask)
+{
+
+ hwc_data.write_nonprio
+ = ((mask & ET_Msg_Mask) == ET_Msg_Mask);
+
+ hwc_data.write_prio
+ = ((mask & ET_PMsgCmd_Mask) == ET_PMsgCmd_Mask);
+
+ if (hwc_data.write_prio || hwc_data.write_nonprio) {
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "can write messages\n");
+ return 0;
+ } else {
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "can not write messages\n");
+ return -1;
+ }
+}
+
+static inline int
+eval_hwc_send_mask (_hwcb_mask_t mask)
+{
+
+ hwc_data.read_statechange
+ = ((mask & ET_StateChange_Mask) == ET_StateChange_Mask);
+ if (hwc_data.read_statechange)
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "can read state change notifications\n");
+ else
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "can not read state change notifications\n");
+
+ hwc_data.read_nonprio
+ = ((mask & ET_OpCmd_Mask) == ET_OpCmd_Mask);
+ if (hwc_data.read_nonprio)
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "can read commands\n");
+
+ hwc_data.read_prio
+ = ((mask & ET_PMsgCmd_Mask) == ET_PMsgCmd_Mask);
+ if (hwc_data.read_prio)
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "can read priority commands\n");
+
+ if (hwc_data.read_prio || hwc_data.read_nonprio) {
+ return 0;
+ } else {
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "can not read commands from operator\n");
+ return -1;
+ }
+}
+
+static int
+eval_statechangebuf (statechangebuf_t * scbuf)
+{
+ int retval = 0;
+
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "HWC state change detected\n");
+
+ if (scbuf->validity_hwc_active_facility_mask) {
+
+ }
+ if (scbuf->validity_hwc_receive_mask) {
+
+ if (scbuf->mask_length != 4) {
+#ifdef DUMP_HWC_INIT_ERROR
+ __asm__ ("LHI 1,0xe50\n\t"
+ "LRA 2,0(%0)\n\t"
+ "J .+0 \n\t"
+ :
+ : "a" (scbuf)
+ : "1", "2");
+#endif
+ } else {
+
+ retval += eval_hwc_receive_mask
+ (scbuf->hwc_receive_mask);
+ }
+ }
+ if (scbuf->validity_hwc_send_mask) {
+
+ if (scbuf->mask_length != 4) {
+#ifdef DUMP_HWC_INIT_ERROR
+ __asm__ ("LHI 1,0xe51\n\t"
+ "LRA 2,0(%0)\n\t"
+ "J .+0 \n\t"
+ :
+ : "a" (scbuf)
+ : "1", "2");
+#endif
+ } else {
+
+ retval += eval_hwc_send_mask
+ (scbuf->hwc_send_mask);
+ }
+ }
+ if (scbuf->validity_read_data_function_mask) {
+
+ }
+ return retval;
+}
+
static int
process_evbufs (void *start, void *end)
{
@@ -1490,17 +1653,17 @@
retval += eval_evbuf (evbuf_data, evbuf_end);
break;
case ET_StateChange:
-
- retval = -ENOSYS;
+ retval += eval_statechangebuf
+ ((statechangebuf_t *) evbuf);
break;
default:
- printk (
- KERN_WARNING
- HWC_RW_PRINT_HEADER
- "unconditional read: "
- "unknown event buffer found, "
- "type 0x%x",
- evbuf->type);
+ internal_print (
+ DELAYED_WRITE,
+ HWC_RW_PRINT_HEADER
+ "unconditional read: "
+ "unknown event buffer found, "
+ "type 0x%x",
+ evbuf->type);
retval = -ENOSYS;
}
evbuf = (evbuf_t *) evbuf_end;
@@ -1515,11 +1678,14 @@
read_hwcb_t *hwcb = (read_hwcb_t *) hwc_data.page;
int retval;
+#if 0
+
if ((!hwc_data.read_prio) && (!hwc_data.read_nonprio))
return -EOPNOTSUPP;
if (hwc_data.current_servc)
return -EBUSY;
+#endif
memset (hwcb, 0x00, PAGE_SIZE);
memcpy (hwcb, &read_hwcb_template, sizeof (read_hwcb_t));
@@ -1529,8 +1695,8 @@
#ifdef DUMP_HWC_READ_ERROR
if (condition_code == HWC_NOT_OPERATIONAL)
__asm__ ("LHI 1,0xe40\n\t"
- "L 2,0(0,%0)\n\t"
- "LRA 3,0(0,%1)\n\t"
+ "L 2,0(%0)\n\t"
+ "LRA 3,0(%1)\n\t"
"J .+0 \n\t"
:
: "a" (&condition_code), "a" (hwc_data.page)
@@ -1564,8 +1730,8 @@
(hwcb->response_code != 0x60F0) &&
(hwcb->response_code != 0x62F0))
__asm__ ("LHI 1,0xe41\n\t"
- "LRA 2,0(0,%0)\n\t"
- "L 3,0(0,%1)\n\t"
+ "LRA 2,0(%0)\n\t"
+ "L 3,0(%1)\n\t"
"J .+0\n\t"
:
: "a" (hwc_data.page), "a" (&(hwcb->response_code))
@@ -1625,26 +1791,21 @@
internal_print (
IMMEDIATE_WRITE,
HWC_RW_PRINT_HEADER
- "unconditional read: invalid function code - this "
- "must not occur in a correct driver, please contact "
- "author\n");
+ "unconditional read: invalid function code\n");
return -EIO;
case 0x70F0:
internal_print (
IMMEDIATE_WRITE,
HWC_RW_PRINT_HEADER
- "unconditional read: invalid selection mask - this "
- "must not occur in a correct driver, please contact "
- "author\n");
+ "unconditional read: invalid selection mask\n");
return -EIO;
case 0x0040:
internal_print (
IMMEDIATE_WRITE,
HWC_RW_PRINT_HEADER
- "unconditional read: HWC equipment check - don't "
- "know how to handle this case\n");
+ "unconditional read: HWC equipment check\n");
return -EIO;
default:
@@ -1671,8 +1832,8 @@
if (condition_code == HWC_NOT_OPERATIONAL)
__asm__ ("LHI 1,0xe10\n\t"
- "L 2,0(0,%0)\n\t"
- "LRA 3,0(0,%1)\n\t"
+ "L 2,0(%0)\n\t"
+ "LRA 3,0(%1)\n\t"
"J .+0\n\t"
:
: "a" (&condition_code), "a" (hwc_data.page)
@@ -1701,38 +1862,34 @@
init_hwcb_t *hwcb = (init_hwcb_t *) hwc_data.page;
int retval = 0;
- if (hwcb->hwc_receive_mask & ET_Msg_Mask)
- hwc_data.write_nonprio = 1;
-
- if (hwcb->hwc_receive_mask & ET_PMsgCmd_Mask)
- hwc_data.write_prio = 1;
-
- if (hwcb->hwc_send_mask & ET_OpCmd_Mask) {
- internal_print (DELAYED_WRITE,
- HWC_RW_PRINT_HEADER
- "capable of receipt of commands\n");
- hwc_data.read_nonprio = 1;
- }
- if (hwcb->hwc_send_mask & ET_PMsgCmd_Mask) {
- internal_print (DELAYED_WRITE,
- HWC_RW_PRINT_HEADER
- "capable of receipt of priority commands\n");
- hwc_data.read_nonprio = 1;
- }
- if ((hwcb->response_code != 0x0020) ||
- (!hwc_data.write_nonprio) ||
- ((!hwc_data.read_nonprio) && (!hwc_data.read_prio)))
+ if (hwcb->response_code != 0x0020) {
#ifdef DUMP_HWC_INIT_ERROR
__asm__ ("LHI 1,0xe11\n\t"
- "LRA 2,0(0,%0)\n\t"
- "L 3,0(0,%1)\n\t"
+ "LRA 2,0(%0)\n\t"
+ "L 3,0(%1)\n\t"
"J .+0\n\t"
:
: "a" (hwcb), "a" (&(hwcb->response_code))
: "1", "2", "3");
#else
- retval = -EIO;
+ retval = -1;
#endif
+ } else {
+ if (hwcb->mask_length != 4) {
+#ifdef DUMP_HWC_INIT_ERROR
+ __asm__ ("LHI 1,0xe52\n\t"
+ "LRA 2,0(%0)\n\t"
+ "J .+0 \n\t"
+ :
+ : "a" (hwcb)
+ : "1", "2");
+#endif
+ } else {
+ retval += eval_hwc_receive_mask
+ (hwcb->hwc_receive_mask);
+ retval += eval_hwc_send_mask (hwcb->hwc_send_mask);
+ }
+ }
hwc_data.current_servc = 0;
hwc_data.current_hwcb = NULL;
@@ -1764,18 +1921,6 @@
} else
tmp.columns = ioctls->columns;
- switch (ioctls->code) {
- case CODE_EBCDIC:
- case CODE_ASCII:
- tmp.code = ioctls->code;
- break;
- default:
- if (correct)
- tmp.code = CODE_ASCII;
- else
- retval = -EINVAL;
- }
-
tmp.final_nl = ioctls->final_nl;
if (ioctls->max_hwcb < 2) {
@@ -1915,7 +2060,7 @@
HWC_RW_PRINT_HEADER
"use %i bytes for buffering.\n",
hwc_data.ioctls.kmem_hwcb * PAGE_SIZE);
- for (i = 0; i < 500; i++) {
+ for (i = 0; i < 2000; i++) {
hwcb = (init_hwcb_t *) BUF_HWCB;
internal_print (
DELAYED_WRITE,
@@ -1975,6 +2120,10 @@
} else {
spin_lock (&hwc_data.lock);
+ if (hwc_data.flags & HWC_PTIMER_RUNS) {
+ del_timer (&hwc_data.poll_timer);
+ hwc_data.flags &= ~HWC_PTIMER_RUNS;
+ }
if (!hwc_data.current_servc) {
unconditional_read_1 ();
@@ -2064,12 +2213,6 @@
goto fault;
break;
- case TIOCHWCSCODE:
- if (get_user (tmp.code, (ioctl_code_t *) arg))
- goto fault;
-
- break;
-
case TIOCHWCSNL:
if (get_user (tmp.final_nl, (ioctl_nl_t *) arg))
goto fault;
@@ -2126,12 +2269,6 @@
case TIOCHWCGCOLS:
if (put_user (tmp.columns, (ioctl_cols_t *) arg))
goto fault;
- break;
-
- case TIOCHWCGCODE:
- if (put_user (tmp.code, (ioctl_code_t *) arg))
- goto fault;
-
break;
case TIOCHWCGNL:
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)