Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
983f27d3
Commit
983f27d3
authored
May 26, 2006
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'upstream-fixes' into upstream
Conflicts: drivers/s390/net/ctctty.c
parents
de1e938e
e82b0f2c
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
632 additions
and
624 deletions
+632
-624
drivers/s390/net/ctcmain.c
drivers/s390/net/ctcmain.c
+13
-13
drivers/s390/net/cu3088.c
drivers/s390/net/cu3088.c
+5
-5
drivers/s390/net/iucv.c
drivers/s390/net/iucv.c
+18
-18
drivers/s390/net/iucv.h
drivers/s390/net/iucv.h
+311
-311
drivers/s390/net/lcs.c
drivers/s390/net/lcs.c
+173
-172
drivers/s390/net/lcs.h
drivers/s390/net/lcs.h
+9
-5
drivers/s390/net/netiucv.c
drivers/s390/net/netiucv.c
+18
-18
drivers/s390/net/qeth.h
drivers/s390/net/qeth.h
+9
-9
drivers/s390/net/qeth_eddp.c
drivers/s390/net/qeth_eddp.c
+9
-9
drivers/s390/net/qeth_fs.h
drivers/s390/net/qeth_fs.h
+1
-1
drivers/s390/net/qeth_main.c
drivers/s390/net/qeth_main.c
+55
-52
drivers/s390/net/qeth_mpc.h
drivers/s390/net/qeth_mpc.h
+2
-2
drivers/s390/net/qeth_proc.c
drivers/s390/net/qeth_proc.c
+4
-4
drivers/s390/net/qeth_sys.c
drivers/s390/net/qeth_sys.c
+3
-3
drivers/s390/net/qeth_tso.h
drivers/s390/net/qeth_tso.h
+2
-2
No files found.
drivers/s390/net/ctcmain.c
View file @
983f27d3
...
@@ -1481,13 +1481,13 @@ ch_action_iofatal(fsm_instance * fi, int event, void *arg)
...
@@ -1481,13 +1481,13 @@ ch_action_iofatal(fsm_instance * fi, int event, void *arg)
}
}
}
}
static
void
static
void
ch_action_reinit
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
ch_action_reinit
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
{
{
struct
channel
*
ch
=
(
struct
channel
*
)
arg
;
struct
channel
*
ch
=
(
struct
channel
*
)
arg
;
struct
net_device
*
dev
=
ch
->
netdev
;
struct
net_device
*
dev
=
ch
->
netdev
;
struct
ctc_priv
*
privptr
=
dev
->
priv
;
struct
ctc_priv
*
privptr
=
dev
->
priv
;
DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
ch_action_iofatal
(
fi
,
event
,
arg
);
ch_action_iofatal
(
fi
,
event
,
arg
);
fsm_addtimer
(
&
privptr
->
restart_timer
,
1000
,
DEV_EVENT_RESTART
,
dev
);
fsm_addtimer
(
&
privptr
->
restart_timer
,
1000
,
DEV_EVENT_RESTART
,
dev
);
...
@@ -1619,7 +1619,7 @@ less_than(char *id1, char *id2)
...
@@ -1619,7 +1619,7 @@ less_than(char *id1, char *id2)
}
}
dev1
=
simple_strtoul
(
id1
,
&
id1
,
16
);
dev1
=
simple_strtoul
(
id1
,
&
id1
,
16
);
dev2
=
simple_strtoul
(
id2
,
&
id2
,
16
);
dev2
=
simple_strtoul
(
id2
,
&
id2
,
16
);
return
(
dev1
<
dev2
);
return
(
dev1
<
dev2
);
}
}
...
@@ -1890,7 +1890,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
...
@@ -1890,7 +1890,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
irb
->
scsw
.
dstat
);
irb
->
scsw
.
dstat
);
return
;
return
;
}
}
priv
=
((
struct
ccwgroup_device
*
)
cdev
->
dev
.
driver_data
)
priv
=
((
struct
ccwgroup_device
*
)
cdev
->
dev
.
driver_data
)
->
dev
.
driver_data
;
->
dev
.
driver_data
;
...
@@ -1904,7 +1904,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
...
@@ -1904,7 +1904,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
"device %s
\n
"
,
cdev
->
dev
.
bus_id
);
"device %s
\n
"
,
cdev
->
dev
.
bus_id
);
return
;
return
;
}
}
dev
=
(
struct
net_device
*
)
(
ch
->
netdev
);
dev
=
(
struct
net_device
*
)
(
ch
->
netdev
);
if
(
dev
==
NULL
)
{
if
(
dev
==
NULL
)
{
ctc_pr_crit
(
"ctc: ctc_irq_handler dev=NULL bus_id=%s, ch=0x%p
\n
"
,
ctc_pr_crit
(
"ctc: ctc_irq_handler dev=NULL bus_id=%s, ch=0x%p
\n
"
,
...
@@ -2003,12 +2003,12 @@ dev_action_stop(fsm_instance * fi, int event, void *arg)
...
@@ -2003,12 +2003,12 @@ dev_action_stop(fsm_instance * fi, int event, void *arg)
fsm_event
(
ch
->
fsm
,
CH_EVENT_STOP
,
ch
);
fsm_event
(
ch
->
fsm
,
CH_EVENT_STOP
,
ch
);
}
}
}
}
static
void
static
void
dev_action_restart
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
dev_action_restart
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
{
{
struct
net_device
*
dev
=
(
struct
net_device
*
)
arg
;
struct
net_device
*
dev
=
(
struct
net_device
*
)
arg
;
struct
ctc_priv
*
privptr
=
dev
->
priv
;
struct
ctc_priv
*
privptr
=
dev
->
priv
;
DBF_TEXT
(
trace
,
3
,
__FUNCTION__
);
DBF_TEXT
(
trace
,
3
,
__FUNCTION__
);
ctc_pr_debug
(
"%s: Restarting
\n
"
,
dev
->
name
);
ctc_pr_debug
(
"%s: Restarting
\n
"
,
dev
->
name
);
dev_action_stop
(
fi
,
event
,
arg
);
dev_action_stop
(
fi
,
event
,
arg
);
...
@@ -2179,7 +2179,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
...
@@ -2179,7 +2179,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
DBF_TEXT
(
trace
,
5
,
__FUNCTION__
);
DBF_TEXT
(
trace
,
5
,
__FUNCTION__
);
/* we need to acquire the lock for testing the state
/* we need to acquire the lock for testing the state
* otherwise we can have an IRQ changing the state to
* otherwise we can have an IRQ changing the state to
* TXIDLE after the test but before acquiring the lock.
* TXIDLE after the test but before acquiring the lock.
*/
*/
spin_lock_irqsave
(
&
ch
->
collect_lock
,
saveflags
);
spin_lock_irqsave
(
&
ch
->
collect_lock
,
saveflags
);
...
@@ -2379,7 +2379,7 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev)
...
@@ -2379,7 +2379,7 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev)
/**
/**
* If channels are not running, try to restart them
* If channels are not running, try to restart them
* and throw away packet.
* and throw away packet.
*/
*/
if
(
fsm_getstate
(
privptr
->
fsm
)
!=
DEV_STATE_RUNNING
)
{
if
(
fsm_getstate
(
privptr
->
fsm
)
!=
DEV_STATE_RUNNING
)
{
fsm_event
(
privptr
->
fsm
,
DEV_EVENT_START
,
dev
);
fsm_event
(
privptr
->
fsm
,
DEV_EVENT_START
,
dev
);
...
@@ -2717,7 +2717,7 @@ ctc_remove_files(struct device *dev)
...
@@ -2717,7 +2717,7 @@ ctc_remove_files(struct device *dev)
/**
/**
* Add ctc specific attributes.
* Add ctc specific attributes.
* Add ctc private data.
* Add ctc private data.
*
*
* @param cgdev pointer to ccwgroup_device just added
* @param cgdev pointer to ccwgroup_device just added
*
*
* @returns 0 on success, !0 on failure.
* @returns 0 on success, !0 on failure.
...
@@ -2848,7 +2848,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
...
@@ -2848,7 +2848,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
DBF_TEXT
(
setup
,
3
,
buffer
);
DBF_TEXT
(
setup
,
3
,
buffer
);
type
=
get_channel_type
(
&
cgdev
->
cdev
[
0
]
->
id
);
type
=
get_channel_type
(
&
cgdev
->
cdev
[
0
]
->
id
);
snprintf
(
read_id
,
CTC_ID_SIZE
,
"ch-%s"
,
cgdev
->
cdev
[
0
]
->
dev
.
bus_id
);
snprintf
(
read_id
,
CTC_ID_SIZE
,
"ch-%s"
,
cgdev
->
cdev
[
0
]
->
dev
.
bus_id
);
snprintf
(
write_id
,
CTC_ID_SIZE
,
"ch-%s"
,
cgdev
->
cdev
[
1
]
->
dev
.
bus_id
);
snprintf
(
write_id
,
CTC_ID_SIZE
,
"ch-%s"
,
cgdev
->
cdev
[
1
]
->
dev
.
bus_id
);
...
@@ -2883,7 +2883,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
...
@@ -2883,7 +2883,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
channel_get
(
type
,
direction
==
READ
?
read_id
:
write_id
,
channel_get
(
type
,
direction
==
READ
?
read_id
:
write_id
,
direction
);
direction
);
if
(
privptr
->
channel
[
direction
]
==
NULL
)
{
if
(
privptr
->
channel
[
direction
]
==
NULL
)
{
if
(
direction
==
WRITE
)
if
(
direction
==
WRITE
)
channel_free
(
privptr
->
channel
[
READ
]);
channel_free
(
privptr
->
channel
[
READ
]);
ctc_free_netdevice
(
dev
,
1
);
ctc_free_netdevice
(
dev
,
1
);
...
@@ -2931,7 +2931,7 @@ ctc_shutdown_device(struct ccwgroup_device *cgdev)
...
@@ -2931,7 +2931,7 @@ ctc_shutdown_device(struct ccwgroup_device *cgdev)
{
{
struct
ctc_priv
*
priv
;
struct
ctc_priv
*
priv
;
struct
net_device
*
ndev
;
struct
net_device
*
ndev
;
DBF_TEXT
(
setup
,
3
,
__FUNCTION__
);
DBF_TEXT
(
setup
,
3
,
__FUNCTION__
);
pr_debug
(
"%s() called
\n
"
,
__FUNCTION__
);
pr_debug
(
"%s() called
\n
"
,
__FUNCTION__
);
...
...
drivers/s390/net/cu3088.c
View file @
983f27d3
...
@@ -20,7 +20,7 @@
...
@@ -20,7 +20,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
*/
*/
#include <linux/init.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/module.h>
#include <linux/err.h>
#include <linux/err.h>
...
@@ -77,7 +77,7 @@ group_write(struct device_driver *drv, const char *buf, size_t count)
...
@@ -77,7 +77,7 @@ group_write(struct device_driver *drv, const char *buf, size_t count)
int
len
;
int
len
;
if
(
!
(
end
=
strchr
(
start
,
delim
[
i
])))
if
(
!
(
end
=
strchr
(
start
,
delim
[
i
])))
return
count
;
return
-
EINVAL
;
len
=
min_t
(
ptrdiff_t
,
BUS_ID_SIZE
,
end
-
start
+
1
);
len
=
min_t
(
ptrdiff_t
,
BUS_ID_SIZE
,
end
-
start
+
1
);
strlcpy
(
bus_ids
[
i
],
start
,
len
);
strlcpy
(
bus_ids
[
i
],
start
,
len
);
argv
[
i
]
=
bus_ids
[
i
];
argv
[
i
]
=
bus_ids
[
i
];
...
@@ -94,7 +94,7 @@ static DRIVER_ATTR(group, 0200, NULL, group_write);
...
@@ -94,7 +94,7 @@ static DRIVER_ATTR(group, 0200, NULL, group_write);
/* Register-unregister for ctc&lcs */
/* Register-unregister for ctc&lcs */
int
int
register_cu3088_discipline
(
struct
ccwgroup_driver
*
dcp
)
register_cu3088_discipline
(
struct
ccwgroup_driver
*
dcp
)
{
{
int
rc
;
int
rc
;
...
@@ -109,7 +109,7 @@ register_cu3088_discipline(struct ccwgroup_driver *dcp)
...
@@ -109,7 +109,7 @@ register_cu3088_discipline(struct ccwgroup_driver *dcp)
rc
=
driver_create_file
(
&
dcp
->
driver
,
&
driver_attr_group
);
rc
=
driver_create_file
(
&
dcp
->
driver
,
&
driver_attr_group
);
if
(
rc
)
if
(
rc
)
ccwgroup_driver_unregister
(
dcp
);
ccwgroup_driver_unregister
(
dcp
);
return
rc
;
return
rc
;
}
}
...
@@ -137,7 +137,7 @@ static int __init
...
@@ -137,7 +137,7 @@ static int __init
cu3088_init
(
void
)
cu3088_init
(
void
)
{
{
int
rc
;
int
rc
;
cu3088_root_dev
=
s390_root_dev_register
(
"cu3088"
);
cu3088_root_dev
=
s390_root_dev_register
(
"cu3088"
);
if
(
IS_ERR
(
cu3088_root_dev
))
if
(
IS_ERR
(
cu3088_root_dev
))
return
PTR_ERR
(
cu3088_root_dev
);
return
PTR_ERR
(
cu3088_root_dev
);
...
...
drivers/s390/net/iucv.c
View file @
983f27d3
/*
/*
* IUCV network driver
* IUCV network driver
*
*
* Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
* Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
...
@@ -28,7 +28,7 @@
...
@@ -28,7 +28,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
*/
*/
/* #define DEBUG */
/* #define DEBUG */
#include <linux/module.h>
#include <linux/module.h>
...
@@ -81,7 +81,7 @@ iucv_bus_match (struct device *dev, struct device_driver *drv)
...
@@ -81,7 +81,7 @@ iucv_bus_match (struct device *dev, struct device_driver *drv)
struct
bus_type
iucv_bus
=
{
struct
bus_type
iucv_bus
=
{
.
name
=
"iucv"
,
.
name
=
"iucv"
,
.
match
=
iucv_bus_match
,
.
match
=
iucv_bus_match
,
};
};
struct
device
*
iucv_root
;
struct
device
*
iucv_root
;
...
@@ -297,7 +297,7 @@ MODULE_LICENSE("GPL");
...
@@ -297,7 +297,7 @@ MODULE_LICENSE("GPL");
/*
/*
* Debugging stuff
* Debugging stuff
*******************************************************************************/
*******************************************************************************/
#ifdef DEBUG
#ifdef DEBUG
static
int
debuglevel
=
0
;
static
int
debuglevel
=
0
;
...
@@ -344,7 +344,7 @@ do { \
...
@@ -344,7 +344,7 @@ do { \
/*
/*
* Internal functions
* Internal functions
*******************************************************************************/
*******************************************************************************/
/**
/**
* print start banner
* print start banner
*/
*/
...
@@ -810,7 +810,7 @@ iucv_register_program (__u8 pgmname[16],
...
@@ -810,7 +810,7 @@ iucv_register_program (__u8 pgmname[16],
sizeof
(
new_handler
->
id
.
userid
));
sizeof
(
new_handler
->
id
.
userid
));
EBC_TOUPPER
(
new_handler
->
id
.
userid
,
EBC_TOUPPER
(
new_handler
->
id
.
userid
,
sizeof
(
new_handler
->
id
.
userid
));
sizeof
(
new_handler
->
id
.
userid
));
if
(
pgmmask
)
{
if
(
pgmmask
)
{
memcpy
(
new_handler
->
id
.
mask
,
pgmmask
,
memcpy
(
new_handler
->
id
.
mask
,
pgmmask
,
sizeof
(
new_handler
->
id
.
mask
));
sizeof
(
new_handler
->
id
.
mask
));
...
@@ -1229,7 +1229,7 @@ iucv_purge (__u16 pathid, __u32 msgid, __u32 srccls, __u32 *audit)
...
@@ -1229,7 +1229,7 @@ iucv_purge (__u16 pathid, __u32 msgid, __u32 srccls, __u32 *audit)
/* parm->ipaudit has only 3 bytes */
/* parm->ipaudit has only 3 bytes */
*
audit
>>=
8
;
*
audit
>>=
8
;
}
}
release_param
(
parm
);
release_param
(
parm
);
iucv_debug
(
1
,
"b2f0_result = %ld"
,
b2f0_result
);
iucv_debug
(
1
,
"b2f0_result = %ld"
,
b2f0_result
);
...
@@ -2330,14 +2330,14 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
...
@@ -2330,14 +2330,14 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
temp_buff1
[
j
]
&=
(
h
->
id
.
mask
)[
j
];
temp_buff1
[
j
]
&=
(
h
->
id
.
mask
)[
j
];
temp_buff2
[
j
]
&=
(
h
->
id
.
mask
)[
j
];
temp_buff2
[
j
]
&=
(
h
->
id
.
mask
)[
j
];
}
}
iucv_dumpit
(
"temp_buff1:"
,
iucv_dumpit
(
"temp_buff1:"
,
temp_buff1
,
sizeof
(
temp_buff1
));
temp_buff1
,
sizeof
(
temp_buff1
));
iucv_dumpit
(
"temp_buff2"
,
iucv_dumpit
(
"temp_buff2"
,
temp_buff2
,
sizeof
(
temp_buff2
));
temp_buff2
,
sizeof
(
temp_buff2
));
if
(
!
memcmp
(
temp_buff1
,
temp_buff2
,
24
))
{
if
(
!
memcmp
(
temp_buff1
,
temp_buff2
,
24
))
{
iucv_debug
(
2
,
iucv_debug
(
2
,
"found a matching handler"
);
"found a matching handler"
);
break
;
break
;
...
@@ -2368,7 +2368,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
...
@@ -2368,7 +2368,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
}
else
}
else
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
break
;
break
;
case
0x02
:
/*connection complete */
case
0x02
:
/*connection complete */
if
(
messagesDisabled
)
{
if
(
messagesDisabled
)
{
iucv_setmask
(
~
0
);
iucv_setmask
(
~
0
);
...
@@ -2387,7 +2387,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
...
@@ -2387,7 +2387,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
}
else
}
else
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
break
;
break
;
case
0x03
:
/* connection severed */
case
0x03
:
/* connection severed */
if
(
messagesDisabled
)
{
if
(
messagesDisabled
)
{
iucv_setmask
(
~
0
);
iucv_setmask
(
~
0
);
...
@@ -2398,13 +2398,13 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
...
@@ -2398,13 +2398,13 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
interrupt
->
ConnectionSevered
(
interrupt
->
ConnectionSevered
(
(
iucv_ConnectionSevered
*
)
int_buf
,
(
iucv_ConnectionSevered
*
)
int_buf
,
h
->
pgm_data
);
h
->
pgm_data
);
else
else
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
}
else
}
else
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
break
;
break
;
case
0x04
:
/* connection quiesced */
case
0x04
:
/* connection quiesced */
if
(
messagesDisabled
)
{
if
(
messagesDisabled
)
{
iucv_setmask
(
~
0
);
iucv_setmask
(
~
0
);
...
@@ -2420,7 +2420,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
...
@@ -2420,7 +2420,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"ConnectionQuiesced not called"
);
"ConnectionQuiesced not called"
);
}
}
break
;
break
;
case
0x05
:
/* connection resumed */
case
0x05
:
/* connection resumed */
if
(
messagesDisabled
)
{
if
(
messagesDisabled
)
{
iucv_setmask
(
~
0
);
iucv_setmask
(
~
0
);
...
@@ -2436,7 +2436,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
...
@@ -2436,7 +2436,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"ConnectionResumed not called"
);
"ConnectionResumed not called"
);
}
}
break
;
break
;
case
0x06
:
/* priority message complete */
case
0x06
:
/* priority message complete */
case
0x07
:
/* nonpriority message complete */
case
0x07
:
/* nonpriority message complete */
if
(
h
)
{
if
(
h
)
{
...
@@ -2449,7 +2449,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
...
@@ -2449,7 +2449,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"MessageComplete not called"
);
"MessageComplete not called"
);
}
}
break
;
break
;
case
0x08
:
/* priority message pending */
case
0x08
:
/* priority message pending */
case
0x09
:
/* nonpriority message pending */
case
0x09
:
/* nonpriority message pending */
if
(
h
)
{
if
(
h
)
{
...
@@ -2467,7 +2467,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
...
@@ -2467,7 +2467,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
__FUNCTION__
);
__FUNCTION__
);
break
;
break
;
}
/* end switch */
}
/* end switch */
iucv_debug
(
2
,
"exiting pathid %d, type %02X"
,
iucv_debug
(
2
,
"exiting pathid %d, type %02X"
,
int_buf
->
ippathid
,
int_buf
->
iptype
);
int_buf
->
ippathid
,
int_buf
->
iptype
);
...
...
drivers/s390/net/iucv.h
View file @
983f27d3
...
@@ -4,7 +4,7 @@
...
@@ -4,7 +4,7 @@
*
*
* S390 version
* S390 version
* Copyright (C) 2000 IBM Corporation
* Copyright (C) 2000 IBM Corporation
* Author(s):Alan Altmark (Alan_Altmark@us.ibm.com)
* Author(s):Alan Altmark (Alan_Altmark@us.ibm.com)
* Xenia Tkatschow (xenia@us.ibm.com)
* Xenia Tkatschow (xenia@us.ibm.com)
*
*
*
*
...
@@ -16,17 +16,17 @@
...
@@ -16,17 +16,17 @@
* CP Programming Services book, also available on the web
* CP Programming Services book, also available on the web
* thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
* thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
*
*
* Definition of Return Codes
* Definition of Return Codes
* -All positive return codes including zero are reflected back
* -All positive return codes including zero are reflected back
* from CP except for iucv_register_program. The definition of each
* from CP except for iucv_register_program. The definition of each
* return code can be found in CP Programming Services book.
* return code can be found in CP Programming Services book.
* Also available on the web thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
* Also available on the web thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
* - Return Code of:
* - Return Code of:
* (-EINVAL) Invalid value
* (-EINVAL) Invalid value
* (-ENOMEM) storage allocation failed
* (-ENOMEM) storage allocation failed
* pgmask defined in iucv_register_program will be set depending on input
* pgmask defined in iucv_register_program will be set depending on input
* paramters.
* paramters.
*
*
*/
*/
#include <linux/types.h>
#include <linux/types.h>
...
@@ -124,13 +124,13 @@ iucv_hex_dump(unsigned char *buf, size_t len)
...
@@ -124,13 +124,13 @@ iucv_hex_dump(unsigned char *buf, size_t len)
#define iucv_handle_t void *
#define iucv_handle_t void *
/* flags1:
/* flags1:
* All flags are defined in the field IPFLAGS1 of each function
* All flags are defined in the field IPFLAGS1 of each function
* and can be found in CP Programming Services.
* and can be found in CP Programming Services.
* IPLOCAL - Indicates the connect can only be satisfied on the
* IPLOCAL - Indicates the connect can only be satisfied on the
* local system
* local system
* IPPRTY - Indicates a priority message
* IPPRTY - Indicates a priority message
* IPQUSCE - Indicates you do not want to receive messages on a
* IPQUSCE - Indicates you do not want to receive messages on a
* path until an iucv_resume is issued
* path until an iucv_resume is issued
* IPRMDATA - Indicates that the message is in the parameter list
* IPRMDATA - Indicates that the message is in the parameter list
*/
*/
#define IPLOCAL 0x01
#define IPLOCAL 0x01
...
@@ -154,14 +154,14 @@ iucv_hex_dump(unsigned char *buf, size_t len)
...
@@ -154,14 +154,14 @@ iucv_hex_dump(unsigned char *buf, size_t len)
#define AllInterrupts 0xf8
#define AllInterrupts 0xf8
/*
/*
* Mapping of external interrupt buffers should be used with the corresponding
* Mapping of external interrupt buffers should be used with the corresponding
* interrupt types.
* interrupt types.
* Names: iucv_ConnectionPending -> connection pending
* Names: iucv_ConnectionPending -> connection pending
* iucv_ConnectionComplete -> connection complete
* iucv_ConnectionComplete -> connection complete
* iucv_ConnectionSevered -> connection severed
* iucv_ConnectionSevered -> connection severed
* iucv_ConnectionQuiesced -> connection quiesced
* iucv_ConnectionQuiesced -> connection quiesced
* iucv_ConnectionResumed -> connection resumed
* iucv_ConnectionResumed -> connection resumed
* iucv_MessagePending -> message pending
* iucv_MessagePending -> message pending
* iucv_MessageComplete -> message complete
* iucv_MessageComplete -> message complete
*/
*/
typedef
struct
{
typedef
struct
{
u16
ippathid
;
u16
ippathid
;
...
@@ -260,16 +260,16 @@ typedef struct {
...
@@ -260,16 +260,16 @@ typedef struct {
uchar
res2
[
3
];
uchar
res2
[
3
];
}
iucv_MessageComplete
;
}
iucv_MessageComplete
;
/*
/*
* iucv_interrupt_ops_t: Is a vector of functions that handle
* iucv_interrupt_ops_t: Is a vector of functions that handle
* IUCV interrupts.
* IUCV interrupts.
* Parameter list:
* Parameter list:
* eib - is a pointer to a 40-byte area described
* eib - is a pointer to a 40-byte area described
* with one of the structures above.
* with one of the structures above.
* pgm_data - this data is strictly for the
* pgm_data - this data is strictly for the
* interrupt handler that is passed by
* interrupt handler that is passed by
* the application. This may be an address
* the application. This may be an address
* or token.
* or token.
*/
*/
typedef
struct
{
typedef
struct
{
void
(
*
ConnectionPending
)
(
iucv_ConnectionPending
*
eib
,
void
(
*
ConnectionPending
)
(
iucv_ConnectionPending
*
eib
,
...
@@ -287,8 +287,8 @@ typedef struct {
...
@@ -287,8 +287,8 @@ typedef struct {
}
iucv_interrupt_ops_t
;
}
iucv_interrupt_ops_t
;
/*
/*
*iucv_array_t : Defines buffer array.
*iucv_array_t : Defines buffer array.
* Inside the array may be 31- bit addresses and 31-bit lengths.
* Inside the array may be 31- bit addresses and 31-bit lengths.
*/
*/
typedef
struct
{
typedef
struct
{
u32
address
;
u32
address
;
...
@@ -299,19 +299,19 @@ extern struct bus_type iucv_bus;
...
@@ -299,19 +299,19 @@ extern struct bus_type iucv_bus;
extern
struct
device
*
iucv_root
;
extern
struct
device
*
iucv_root
;
/* -prototypes- */
/* -prototypes- */
/*
/*
* Name: iucv_register_program
* Name: iucv_register_program
* Purpose: Registers an application with IUCV
* Purpose: Registers an application with IUCV
* Input: prmname - user identification
* Input: prmname - user identification
* userid - machine identification
* userid - machine identification
* pgmmask - indicates which bits in the prmname and userid combined will be
* pgmmask - indicates which bits in the prmname and userid combined will be
* used to determine who is given control
* used to determine who is given control
* ops - address of vector of interrupt handlers
* ops - address of vector of interrupt handlers
* pgm_data- application data passed to interrupt handlers
* pgm_data- application data passed to interrupt handlers
* Output: NA
* Output: NA
* Return: address of handler
* Return: address of handler
* (0) - Error occurred, registration not completed.
* (0) - Error occurred, registration not completed.
* NOTE: Exact cause of failure will be recorded in syslog.
* NOTE: Exact cause of failure will be recorded in syslog.
*/
*/
iucv_handle_t
iucv_register_program
(
uchar
pgmname
[
16
],
iucv_handle_t
iucv_register_program
(
uchar
pgmname
[
16
],
uchar
userid
[
8
],
uchar
userid
[
8
],
...
@@ -319,13 +319,13 @@ iucv_handle_t iucv_register_program (uchar pgmname[16],
...
@@ -319,13 +319,13 @@ iucv_handle_t iucv_register_program (uchar pgmname[16],
iucv_interrupt_ops_t
*
ops
,
iucv_interrupt_ops_t
*
ops
,
void
*
pgm_data
);
void
*
pgm_data
);
/*
/*
* Name: iucv_unregister_program
* Name: iucv_unregister_program
* Purpose: Unregister application with IUCV
* Purpose: Unregister application with IUCV
* Input: address of handler
* Input: address of handler
* Output: NA
* Output: NA
* Return: (0) - Normal return
* Return: (0) - Normal return
* (-EINVAL) - Internal error, wild pointer
* (-EINVAL) - Internal error, wild pointer
*/
*/
int
iucv_unregister_program
(
iucv_handle_t
handle
);
int
iucv_unregister_program
(
iucv_handle_t
handle
);
...
@@ -333,7 +333,7 @@ int iucv_unregister_program (iucv_handle_t handle);
...
@@ -333,7 +333,7 @@ int iucv_unregister_program (iucv_handle_t handle);
* Name: iucv_accept
* Name: iucv_accept
* Purpose: This function is issued after the user receives a Connection Pending external
* Purpose: This function is issued after the user receives a Connection Pending external
* interrupt and now wishes to complete the IUCV communication path.
* interrupt and now wishes to complete the IUCV communication path.
* Input: pathid - u16 , Path identification number
* Input: pathid - u16 , Path identification number
* msglim_reqstd - u16, The number of outstanding messages requested.
* msglim_reqstd - u16, The number of outstanding messages requested.
* user_data - uchar[16], Data specified by the iucv_connect function.
* user_data - uchar[16], Data specified by the iucv_connect function.
* flags1 - int, Contains options for this path.
* flags1 - int, Contains options for this path.
...
@@ -358,34 +358,34 @@ int iucv_accept (u16 pathid,
...
@@ -358,34 +358,34 @@ int iucv_accept (u16 pathid,
void
*
pgm_data
,
int
*
flags1_out
,
u16
*
msglim
);
void
*
pgm_data
,
int
*
flags1_out
,
u16
*
msglim
);
/*
/*
* Name: iucv_connect
* Name: iucv_connect
* Purpose: This function establishes an IUCV path. Although the connect may complete
* Purpose: This function establishes an IUCV path. Although the connect may complete
* successfully, you are not able to use the path until you receive an IUCV
* successfully, you are not able to use the path until you receive an IUCV
* Connection Complete external interrupt.
* Connection Complete external interrupt.
* Input: pathid - u16 *, Path identification number
* Input: pathid - u16 *, Path identification number
* msglim_reqstd - u16, Number of outstanding messages requested
* msglim_reqstd - u16, Number of outstanding messages requested
* user_data - uchar[16], 16-byte user data
* user_data - uchar[16], 16-byte user data
* userid - uchar[8], User identification
* userid - uchar[8], User identification
* system_name - uchar[8], 8-byte identifying the system name
* system_name - uchar[8], 8-byte identifying the system name
* flags1 - int, Contains options for this path.
* flags1 - int, Contains options for this path.
* -IPPRTY - 0x20, Specifies if you want to send priority message.
* -IPPRTY - 0x20, Specifies if you want to send priority message.
* -IPRMDATA - 0x80, Specifies whether your program can handle a message
* -IPRMDATA - 0x80, Specifies whether your program can handle a message
* in the parameter list.
* in the parameter list.
* -IPQUSCE - 0x40, Specifies whether you want to quiesce the path being
* -IPQUSCE - 0x40, Specifies whether you want to quiesce the path being
* established.
* established.
* -IPLOCAL - 0X01, Allows an application to force the partner to be on
* -IPLOCAL - 0X01, Allows an application to force the partner to be on
* the local system. If local is specified then target class cannot be
* the local system. If local is specified then target class cannot be
* specified.
* specified.
* flags1_out - int * Contains information about the path
* flags1_out - int * Contains information about the path
* - IPPRTY - 0x20, Indicates you may send priority messages.
* - IPPRTY - 0x20, Indicates you may send priority messages.
* msglim - * u16, Number of outstanding messages
* msglim - * u16, Number of outstanding messages
* handle - iucv_handle_t, Address of handler
* handle - iucv_handle_t, Address of handler
* pgm_data - void *, Application data passed to interrupt handlers
* pgm_data - void *, Application data passed to interrupt handlers
* Output: return code from CP IUCV call
* Output: return code from CP IUCV call
* rc - return code from iucv_declare_buffer
* rc - return code from iucv_declare_buffer
* -EINVAL - Invalid handle passed by application
* -EINVAL - Invalid handle passed by application
* -EINVAL - Pathid address is NULL
* -EINVAL - Pathid address is NULL
* add_pathid_result - Return code from internal function add_pathid
* add_pathid_result - Return code from internal function add_pathid
*/
*/
int
int
iucv_connect
(
u16
*
pathid
,
iucv_connect
(
u16
*
pathid
,
...
@@ -397,16 +397,16 @@ int
...
@@ -397,16 +397,16 @@ int
int
*
flags1_out
,
int
*
flags1_out
,
u16
*
msglim
,
iucv_handle_t
handle
,
void
*
pgm_data
);
u16
*
msglim
,
iucv_handle_t
handle
,
void
*
pgm_data
);
/*
/*
* Name: iucv_purge
* Name: iucv_purge
* Purpose: This function cancels a message that you have sent.
* Purpose: This function cancels a message that you have sent.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID of the message to be purged.
* msgid - Specifies the message ID of the message to be purged.
* srccls - Specifies the source message class.
* srccls - Specifies the source message class.
* Output: audit - Contains information about asynchronous error
* Output: audit - Contains information about asynchronous error
* that may have affected the normal completion
* that may have affected the normal completion
* of this message.
* of this message.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
*/
*/
int
iucv_purge
(
u16
pathid
,
u32
msgid
,
u32
srccls
,
__u32
*
audit
);
int
iucv_purge
(
u16
pathid
,
u32
msgid
,
u32
srccls
,
__u32
*
audit
);
/*
/*
...
@@ -426,38 +426,38 @@ ulong iucv_query_maxconn (void);
...
@@ -426,38 +426,38 @@ ulong iucv_query_maxconn (void);
*/
*/
ulong
iucv_query_bufsize
(
void
);
ulong
iucv_query_bufsize
(
void
);
/*
/*
* Name: iucv_quiesce
* Name: iucv_quiesce
* Purpose: This function temporarily suspends incoming messages on an
* Purpose: This function temporarily suspends incoming messages on an
* IUCV path. You can later reactivate the path by invoking
* IUCV path. You can later reactivate the path by invoking
* the iucv_resume function.
* the iucv_resume function.
* Input: pathid - Path identification number
* Input: pathid - Path identification number
* user_data - 16-bytes of user data
* user_data - 16-bytes of user data
* Output: NA
* Output: NA
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
*/
*/
int
iucv_quiesce
(
u16
pathid
,
uchar
user_data
[
16
]);
int
iucv_quiesce
(
u16
pathid
,
uchar
user_data
[
16
]);
/*
/*
* Name: iucv_receive
* Name: iucv_receive
* Purpose: This function receives messages that are being sent to you
* Purpose: This function receives messages that are being sent to you
* over established paths. Data will be returned in buffer for length of
* over established paths. Data will be returned in buffer for length of
* buflen.
* buflen.
* Input:
* Input:
* pathid - Path identification number.
* pathid - Path identification number.
* buffer - Address of buffer to receive.
* buffer - Address of buffer to receive.
* buflen - Length of buffer to receive.
* buflen - Length of buffer to receive.
* msgid - Specifies the message ID.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* Output:
* Output:
* flags1_out: int *, Contains information about this path.
* flags1_out: int *, Contains information about this path.
* IPNORPY - 0x10 Specifies this is a one-way message and no reply is
* IPNORPY - 0x10 Specifies this is a one-way message and no reply is
* expected.
* expected.
* IPPRTY - 0x20 Specifies if you want to send priority message.
* IPPRTY - 0x20 Specifies if you want to send priority message.
* IPRMDATA - 0x80 specifies the data is contained in the parameter list
* IPRMDATA - 0x80 specifies the data is contained in the parameter list
* residual_buffer - address of buffer updated by the number
* residual_buffer - address of buffer updated by the number
* of bytes you have received.
* of bytes you have received.
* residual_length -
* residual_length -
* Contains one of the following values, if the receive buffer is:
* Contains one of the following values, if the receive buffer is:
* The same length as the message, this field is zero.
* The same length as the message, this field is zero.
* Longer than the message, this field contains the number of
* Longer than the message, this field contains the number of
...
@@ -466,8 +466,8 @@ int iucv_quiesce (u16 pathid, uchar user_data[16]);
...
@@ -466,8 +466,8 @@ int iucv_quiesce (u16 pathid, uchar user_data[16]);
* count (that is, the number of bytes remaining in the
* count (that is, the number of bytes remaining in the
* message that does not fit into the buffer. In this
* message that does not fit into the buffer. In this
* case b2f0_result = 5.
* case b2f0_result = 5.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - buffer address is pointing to NULL
* (-EINVAL) - buffer address is pointing to NULL
*/
*/
int
iucv_receive
(
u16
pathid
,
int
iucv_receive
(
u16
pathid
,
u32
msgid
,
u32
msgid
,
...
@@ -477,16 +477,16 @@ int iucv_receive (u16 pathid,
...
@@ -477,16 +477,16 @@ int iucv_receive (u16 pathid,
int
*
flags1_out
,
int
*
flags1_out
,
ulong
*
residual_buffer
,
ulong
*
residual_length
);
ulong
*
residual_buffer
,
ulong
*
residual_length
);
/*
/*
* Name: iucv_receive_array
* Name: iucv_receive_array
* Purpose: This function receives messages that are being sent to you
* Purpose: This function receives messages that are being sent to you
* over established paths. Data will be returned in first buffer for
* over established paths. Data will be returned in first buffer for
* length of first buffer.
* length of first buffer.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* msgid - specifies the message ID.
* msgid - specifies the message ID.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* buffer - Address of array of buffers.
* buffer - Address of array of buffers.
* buflen - Total length of buffers.
* buflen - Total length of buffers.
* Output:
* Output:
* flags1_out: int *, Contains information about this path.
* flags1_out: int *, Contains information about this path.
* IPNORPY - 0x10 Specifies this is a one-way message and no reply is
* IPNORPY - 0x10 Specifies this is a one-way message and no reply is
...
@@ -504,8 +504,8 @@ int iucv_receive (u16 pathid,
...
@@ -504,8 +504,8 @@ int iucv_receive (u16 pathid,
* count (that is, the number of bytes remaining in the
* count (that is, the number of bytes remaining in the
* message that does not fit into the buffer. In this
* message that does not fit into the buffer. In this
* case b2f0_result = 5.
* case b2f0_result = 5.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* (-EINVAL) - Buffer address is NULL.
*/
*/
int
iucv_receive_array
(
u16
pathid
,
int
iucv_receive_array
(
u16
pathid
,
u32
msgid
,
u32
msgid
,
...
@@ -515,44 +515,44 @@ int iucv_receive_array (u16 pathid,
...
@@ -515,44 +515,44 @@ int iucv_receive_array (u16 pathid,
int
*
flags1_out
,
int
*
flags1_out
,
ulong
*
residual_buffer
,
ulong
*
residual_length
);
ulong
*
residual_buffer
,
ulong
*
residual_length
);
/*
/*
* Name: iucv_reject
* Name: iucv_reject
* Purpose: The reject function refuses a specified message. Between the
* Purpose: The reject function refuses a specified message. Between the
* time you are notified of a message and the time that you
* time you are notified of a message and the time that you
* complete the message, the message may be rejected.
* complete the message, the message may be rejected.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* Output: NA
* Output: NA
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
*/
*/
int
iucv_reject
(
u16
pathid
,
u32
msgid
,
u32
trgcls
);
int
iucv_reject
(
u16
pathid
,
u32
msgid
,
u32
trgcls
);
/*
/*
* Name: iucv_reply
* Name: iucv_reply
* Purpose: This function responds to the two-way messages that you
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* which you wish to reply. ie, pathid, msgid, and trgcls.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20, Specifies if you want to send priority message.
* IPPRTY- 0x20, Specifies if you want to send priority message.
* buffer - Address of reply buffer.
* buffer - Address of reply buffer.
* buflen - Length of reply buffer.
* buflen - Length of reply buffer.
* Output: residual_buffer - Address of buffer updated by the number
* Output: residual_buffer - Address of buffer updated by the number
* of bytes you have moved.
* of bytes you have moved.
* residual_length - Contains one of the following values:
* residual_length - Contains one of the following values:
* If the answer buffer is the same length as the reply, this field
* If the answer buffer is the same length as the reply, this field
* contains zero.
* contains zero.
* If the answer buffer is longer than the reply, this field contains
* If the answer buffer is longer than the reply, this field contains
* the number of bytes remaining in the buffer.
* the number of bytes remaining in the buffer.
* If the answer buffer is shorter than the reply, this field contains
* If the answer buffer is shorter than the reply, this field contains
* a residual count (that is, the number of bytes remianing in the
* a residual count (that is, the number of bytes remianing in the
* reply that does not fit into the buffer. In this
* reply that does not fit into the buffer. In this
* case b2f0_result = 5.
* case b2f0_result = 5.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* (-EINVAL) - Buffer address is NULL.
*/
*/
int
iucv_reply
(
u16
pathid
,
int
iucv_reply
(
u16
pathid
,
u32
msgid
,
u32
msgid
,
...
@@ -561,20 +561,20 @@ int iucv_reply (u16 pathid,
...
@@ -561,20 +561,20 @@ int iucv_reply (u16 pathid,
void
*
buffer
,
ulong
buflen
,
ulong
*
residual_buffer
,
void
*
buffer
,
ulong
buflen
,
ulong
*
residual_buffer
,
ulong
*
residual_length
);
ulong
*
residual_length
);
/*
/*
* Name: iucv_reply_array
* Name: iucv_reply_array
* Purpose: This function responds to the two-way messages that you
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* which you wish to reply. ie, pathid, msgid, and trgcls.
* The array identifies a list of addresses and lengths of
* The array identifies a list of addresses and lengths of
* discontiguous buffers that contains the reply data.
* discontiguous buffers that contains the reply data.
* Input: pathid - Path identification number
* Input: pathid - Path identification number
* msgid - Specifies the message ID.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20, Specifies if you want to send priority message.
* IPPRTY- 0x20, Specifies if you want to send priority message.
* buffer - Address of array of reply buffers.
* buffer - Address of array of reply buffers.
* buflen - Total length of reply buffers.
* buflen - Total length of reply buffers.
* Output: residual_buffer - Address of buffer which IUCV is currently working on.
* Output: residual_buffer - Address of buffer which IUCV is currently working on.
* residual_length - Contains one of the following values:
* residual_length - Contains one of the following values:
* If the answer buffer is the same length as the reply, this field
* If the answer buffer is the same length as the reply, this field
...
@@ -585,8 +585,8 @@ int iucv_reply (u16 pathid,
...
@@ -585,8 +585,8 @@ int iucv_reply (u16 pathid,
* a residual count (that is, the number of bytes remianing in the
* a residual count (that is, the number of bytes remianing in the
* reply that does not fit into the buffer. In this
* reply that does not fit into the buffer. In this
* case b2f0_result = 5.
* case b2f0_result = 5.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* (-EINVAL) - Buffer address is NULL.
*/
*/
int
iucv_reply_array
(
u16
pathid
,
int
iucv_reply_array
(
u16
pathid
,
u32
msgid
,
u32
msgid
,
...
@@ -596,77 +596,77 @@ int iucv_reply_array (u16 pathid,
...
@@ -596,77 +596,77 @@ int iucv_reply_array (u16 pathid,
ulong
buflen
,
ulong
*
residual_address
,
ulong
buflen
,
ulong
*
residual_address
,
ulong
*
residual_length
);
ulong
*
residual_length
);
/*
/*
* Name: iucv_reply_prmmsg
* Name: iucv_reply_prmmsg
* Purpose: This function responds to the two-way messages that you
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* which you wish to reply. ie, pathid, msgid, and trgcls.
* Prmmsg signifies the data is moved into the
* Prmmsg signifies the data is moved into the
* parameter list.
* parameter list.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* prmmsg - 8-bytes of data to be placed into the parameter.
* prmmsg - 8-bytes of data to be placed into the parameter.
* list.
* list.
* Output: NA
* Output: NA
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
*/
*/
int
iucv_reply_prmmsg
(
u16
pathid
,
int
iucv_reply_prmmsg
(
u16
pathid
,
u32
msgid
,
u32
trgcls
,
int
flags1
,
uchar
prmmsg
[
8
]);
u32
msgid
,
u32
trgcls
,
int
flags1
,
uchar
prmmsg
[
8
]);
/*
/*
* Name: iucv_resume
* Name: iucv_resume
* Purpose: This function restores communications over a quiesced path
* Purpose: This function restores communications over a quiesced path
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* user_data - 16-bytes of user data.
* user_data - 16-bytes of user data.
* Output: NA
* Output: NA
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
*/
*/
int
iucv_resume
(
u16
pathid
,
uchar
user_data
[
16
]);
int
iucv_resume
(
u16
pathid
,
uchar
user_data
[
16
]);
/*
/*
* Name: iucv_send
* Name: iucv_send
* Purpose: This function transmits data to another application.
* Purpose: This function transmits data to another application.
* Data to be transmitted is in a buffer and this is a
* Data to be transmitted is in a buffer and this is a
* one-way message and the receiver will not reply to the
* one-way message and the receiver will not reply to the
* message.
* message.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* buffer - Address of send buffer.
* buffer - Address of send buffer.
* buflen - Length of send buffer.
* buflen - Length of send buffer.
* Output: msgid - Specifies the message ID.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* (-EINVAL) - Buffer address is NULL.
*/
*/
int
iucv_send
(
u16
pathid
,
int
iucv_send
(
u16
pathid
,
u32
*
msgid
,
u32
*
msgid
,
u32
trgcls
,
u32
trgcls
,
u32
srccls
,
u32
msgtag
,
int
flags1
,
void
*
buffer
,
ulong
buflen
);
u32
srccls
,
u32
msgtag
,
int
flags1
,
void
*
buffer
,
ulong
buflen
);
/*
/*
* Name: iucv_send_array
* Name: iucv_send_array
* Purpose: This function transmits data to another application.
* Purpose: This function transmits data to another application.
* The contents of buffer is the address of the array of
* The contents of buffer is the address of the array of
* addresses and lengths of discontiguous buffers that hold
* addresses and lengths of discontiguous buffers that hold
* the message text. This is a one-way message and the
* the message text. This is a one-way message and the
* receiver will not reply to the message.
* receiver will not reply to the message.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated witht the message.
* msgtag - Specifies a tag to be associated witht the message.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- specifies if you want to send priority message.
* IPPRTY- specifies if you want to send priority message.
* buffer - Address of array of send buffers.
* buffer - Address of array of send buffers.
* buflen - Total length of send buffers.
* buflen - Total length of send buffers.
* Output: msgid - Specifies the message ID.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* (-EINVAL) - Buffer address is NULL.
*/
*/
int
iucv_send_array
(
u16
pathid
,
int
iucv_send_array
(
u16
pathid
,
u32
*
msgid
,
u32
*
msgid
,
...
@@ -675,48 +675,48 @@ int iucv_send_array (u16 pathid,
...
@@ -675,48 +675,48 @@ int iucv_send_array (u16 pathid,
u32
msgtag
,
u32
msgtag
,
int
flags1
,
iucv_array_t
*
buffer
,
ulong
buflen
);
int
flags1
,
iucv_array_t
*
buffer
,
ulong
buflen
);
/*
/*
* Name: iucv_send_prmmsg
* Name: iucv_send_prmmsg
* Purpose: This function transmits data to another application.
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a one-way message and the
* into the parameter list. This is a one-way message and the
* receiver will not reply to the message.
* receiver will not reply to the message.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20 specifies if you want to send priority message.
* IPPRTY- 0x20 specifies if you want to send priority message.
* prmmsg - 8-bytes of data to be placed into parameter list.
* prmmsg - 8-bytes of data to be placed into parameter list.
* Output: msgid - Specifies the message ID.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
*/
*/
int
iucv_send_prmmsg
(
u16
pathid
,
int
iucv_send_prmmsg
(
u16
pathid
,
u32
*
msgid
,
u32
*
msgid
,
u32
trgcls
,
u32
trgcls
,
u32
srccls
,
u32
msgtag
,
int
flags1
,
uchar
prmmsg
[
8
]);
u32
srccls
,
u32
msgtag
,
int
flags1
,
uchar
prmmsg
[
8
]);
/*
/*
* Name: iucv_send2way
* Name: iucv_send2way
* Purpose: This function transmits data to another application.
* Purpose: This function transmits data to another application.
* Data to be transmitted is in a buffer. The receiver
* Data to be transmitted is in a buffer. The receiver
* of the send is expected to reply to the message and
* of the send is expected to reply to the message and
* a buffer is provided into which IUCV moves the reply
* a buffer is provided into which IUCV moves the reply
* to this message.
* to this message.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag associated with the message.
* msgtag - Specifies a tag associated with the message.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* buffer - Address of send buffer.
* buffer - Address of send buffer.
* buflen - Length of send buffer.
* buflen - Length of send buffer.
* ansbuf - Address of buffer into which IUCV moves the reply of
* ansbuf - Address of buffer into which IUCV moves the reply of
* this message.
* this message.
* anslen - Address of length of buffer.
* anslen - Address of length of buffer.
* Output: msgid - Specifies the message ID.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer or ansbuf address is NULL.
* (-EINVAL) - Buffer or ansbuf address is NULL.
*/
*/
int
iucv_send2way
(
u16
pathid
,
int
iucv_send2way
(
u16
pathid
,
u32
*
msgid
,
u32
*
msgid
,
...
@@ -726,28 +726,28 @@ int iucv_send2way (u16 pathid,
...
@@ -726,28 +726,28 @@ int iucv_send2way (u16 pathid,
int
flags1
,
int
flags1
,
void
*
buffer
,
ulong
buflen
,
void
*
ansbuf
,
ulong
anslen
);
void
*
buffer
,
ulong
buflen
,
void
*
ansbuf
,
ulong
anslen
);
/*
/*
* Name: iucv_send2way_array
* Name: iucv_send2way_array
* Purpose: This function transmits data to another application.
* Purpose: This function transmits data to another application.
* The contents of buffer is the address of the array of
* The contents of buffer is the address of the array of
* addresses and lengths of discontiguous buffers that hold
* addresses and lengths of discontiguous buffers that hold
* the message text. The receiver of the send is expected to
* the message text. The receiver of the send is expected to
* reply to the message and a buffer is provided into which
* reply to the message and a buffer is provided into which
* IUCV moves the reply to this message.
* IUCV moves the reply to this message.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* buffer - Sddress of array of send buffers.
* buffer - Sddress of array of send buffers.
* buflen - Total length of send buffers.
* buflen - Total length of send buffers.
* ansbuf - Address of array of buffer into which IUCV moves the reply
* ansbuf - Address of array of buffer into which IUCV moves the reply
* of this message.
* of this message.
* anslen - Address of length reply buffers.
* anslen - Address of length reply buffers.
* Output: msgid - Specifies the message ID.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* (-EINVAL) - Buffer address is NULL.
*/
*/
int
iucv_send2way_array
(
u16
pathid
,
int
iucv_send2way_array
(
u16
pathid
,
u32
*
msgid
,
u32
*
msgid
,
...
@@ -758,27 +758,27 @@ int iucv_send2way_array (u16 pathid,
...
@@ -758,27 +758,27 @@ int iucv_send2way_array (u16 pathid,
iucv_array_t
*
buffer
,
iucv_array_t
*
buffer
,
ulong
buflen
,
iucv_array_t
*
ansbuf
,
ulong
anslen
);
ulong
buflen
,
iucv_array_t
*
ansbuf
,
ulong
anslen
);
/*
/*
* Name: iucv_send2way_prmmsg
* Name: iucv_send2way_prmmsg
* Purpose: This function transmits data to another application.
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a two-way message and the
* into the parameter list. This is a two-way message and the
* receiver of the message is expected to reply. A buffer
* receiver of the message is expected to reply. A buffer
* is provided into which IUCV moves the reply to this
* is provided into which IUCV moves the reply to this
* message.
* message.
* Input: pathid - Rath identification number.
* Input: pathid - Rath identification number.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* prmmsg - 8-bytes of data to be placed in parameter list.
* prmmsg - 8-bytes of data to be placed in parameter list.
* ansbuf - Address of buffer into which IUCV moves the reply of
* ansbuf - Address of buffer into which IUCV moves the reply of
* this message.
* this message.
* anslen - Address of length of buffer.
* anslen - Address of length of buffer.
* Output: msgid - Specifies the message ID.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* (-EINVAL) - Buffer address is NULL.
*/
*/
int
iucv_send2way_prmmsg
(
u16
pathid
,
int
iucv_send2way_prmmsg
(
u16
pathid
,
u32
*
msgid
,
u32
*
msgid
,
...
@@ -788,29 +788,29 @@ int iucv_send2way_prmmsg (u16 pathid,
...
@@ -788,29 +788,29 @@ int iucv_send2way_prmmsg (u16 pathid,
ulong
flags1
,
ulong
flags1
,
uchar
prmmsg
[
8
],
void
*
ansbuf
,
ulong
anslen
);
uchar
prmmsg
[
8
],
void
*
ansbuf
,
ulong
anslen
);
/*
/*
* Name: iucv_send2way_prmmsg_array
* Name: iucv_send2way_prmmsg_array
* Purpose: This function transmits data to another application.
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a two-way message and the
* into the parameter list. This is a two-way message and the
* receiver of the message is expected to reply. A buffer
* receiver of the message is expected to reply. A buffer
* is provided into which IUCV moves the reply to this
* is provided into which IUCV moves the reply to this
* message. The contents of ansbuf is the address of the
* message. The contents of ansbuf is the address of the
* array of addresses and lengths of discontiguous buffers
* array of addresses and lengths of discontiguous buffers
* that contain the reply.
* that contain the reply.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* flags1 - Option for path.
* IPPRTY- 0x20 specifies if you want to send priority message.
* IPPRTY- 0x20 specifies if you want to send priority message.
* prmmsg - 8-bytes of data to be placed into the parameter list.
* prmmsg - 8-bytes of data to be placed into the parameter list.
* ansbuf - Address of array of buffer into which IUCV moves the reply
* ansbuf - Address of array of buffer into which IUCV moves the reply
* of this message.
* of this message.
* anslen - Address of length of reply buffers.
* anslen - Address of length of reply buffers.
* Output: msgid - Specifies the message ID.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Ansbuf address is NULL.
* (-EINVAL) - Ansbuf address is NULL.
*/
*/
int
iucv_send2way_prmmsg_array
(
u16
pathid
,
int
iucv_send2way_prmmsg_array
(
u16
pathid
,
u32
*
msgid
,
u32
*
msgid
,
...
@@ -821,29 +821,29 @@ int iucv_send2way_prmmsg_array (u16 pathid,
...
@@ -821,29 +821,29 @@ int iucv_send2way_prmmsg_array (u16 pathid,
uchar
prmmsg
[
8
],
uchar
prmmsg
[
8
],
iucv_array_t
*
ansbuf
,
ulong
anslen
);
iucv_array_t
*
ansbuf
,
ulong
anslen
);
/*
/*
* Name: iucv_setmask
* Name: iucv_setmask
* Purpose: This function enables or disables the following IUCV
* Purpose: This function enables or disables the following IUCV
* external interruptions: Nonpriority and priority message
* external interruptions: Nonpriority and priority message
* interrupts, nonpriority and priority reply interrupts.
* interrupts, nonpriority and priority reply interrupts.
* Input: SetMaskFlag - options for interrupts
* Input: SetMaskFlag - options for interrupts
* 0x80 - Nonpriority_MessagePendingInterruptsFlag
* 0x80 - Nonpriority_MessagePendingInterruptsFlag
* 0x40 - Priority_MessagePendingInterruptsFlag
* 0x40 - Priority_MessagePendingInterruptsFlag
* 0x20 - Nonpriority_MessageCompletionInterruptsFlag
* 0x20 - Nonpriority_MessageCompletionInterruptsFlag
* 0x10 - Priority_MessageCompletionInterruptsFlag
* 0x10 - Priority_MessageCompletionInterruptsFlag
* 0x08 - IUCVControlInterruptsFlag
* 0x08 - IUCVControlInterruptsFlag
* Output: NA
* Output: NA
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
*/
*/
int
iucv_setmask
(
int
SetMaskFlag
);
int
iucv_setmask
(
int
SetMaskFlag
);
/*
/*
* Name: iucv_sever
* Name: iucv_sever
* Purpose: This function terminates an IUCV path.
* Purpose: This function terminates an IUCV path.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* user_data - 16-bytes of user data.
* user_data - 16-bytes of user data.
* Output: NA
* Output: NA
* Return: Return code from CP IUCV call.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Interal error, wild pointer.
* (-EINVAL) - Interal error, wild pointer.
*/
*/
int
iucv_sever
(
u16
pathid
,
uchar
user_data
[
16
]);
int
iucv_sever
(
u16
pathid
,
uchar
user_data
[
16
]);
drivers/s390/net/lcs.c
View file @
983f27d3
...
@@ -68,6 +68,7 @@ static void lcs_tasklet(unsigned long);
...
@@ -68,6 +68,7 @@ static void lcs_tasklet(unsigned long);
static
void
lcs_start_kernel_thread
(
struct
lcs_card
*
card
);
static
void
lcs_start_kernel_thread
(
struct
lcs_card
*
card
);
static
void
lcs_get_frames_cb
(
struct
lcs_channel
*
,
struct
lcs_buffer
*
);
static
void
lcs_get_frames_cb
(
struct
lcs_channel
*
,
struct
lcs_buffer
*
);
static
int
lcs_send_delipm
(
struct
lcs_card
*
,
struct
lcs_ipm_list
*
);
static
int
lcs_send_delipm
(
struct
lcs_card
*
,
struct
lcs_ipm_list
*
);
static
int
lcs_recovery
(
void
*
ptr
);
/**
/**
* Debug Facility Stuff
* Debug Facility Stuff
...
@@ -429,12 +430,6 @@ lcs_setup_card(struct lcs_card *card)
...
@@ -429,12 +430,6 @@ lcs_setup_card(struct lcs_card *card)
card
->
tx_buffer
=
NULL
;
card
->
tx_buffer
=
NULL
;
card
->
tx_emitted
=
0
;
card
->
tx_emitted
=
0
;
/* Initialize kernel thread task used for LGW commands. */
INIT_WORK
(
&
card
->
kernel_thread_starter
,
(
void
*
)
lcs_start_kernel_thread
,
card
);
card
->
thread_start_mask
=
0
;
card
->
thread_allowed_mask
=
0
;
card
->
thread_running_mask
=
0
;
init_waitqueue_head
(
&
card
->
wait_q
);
init_waitqueue_head
(
&
card
->
wait_q
);
spin_lock_init
(
&
card
->
lock
);
spin_lock_init
(
&
card
->
lock
);
spin_lock_init
(
&
card
->
ipm_lock
);
spin_lock_init
(
&
card
->
ipm_lock
);
...
@@ -675,8 +670,9 @@ lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
...
@@ -675,8 +670,9 @@ lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
int
index
,
rc
;
int
index
,
rc
;
LCS_DBF_TEXT
(
5
,
trace
,
"rdybuff"
);
LCS_DBF_TEXT
(
5
,
trace
,
"rdybuff"
);
BUG_ON
(
buffer
->
state
!=
BUF_STATE_LOCKED
&&
if
(
buffer
->
state
!=
BUF_STATE_LOCKED
&&
buffer
->
state
!=
BUF_STATE_PROCESSED
);
buffer
->
state
!=
BUF_STATE_PROCESSED
)
BUG
();
spin_lock_irqsave
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
spin_lock_irqsave
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
buffer
->
state
=
BUF_STATE_READY
;
buffer
->
state
=
BUF_STATE_READY
;
index
=
buffer
-
channel
->
iob
;
index
=
buffer
-
channel
->
iob
;
...
@@ -700,7 +696,8 @@ __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
...
@@ -700,7 +696,8 @@ __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
int
index
,
prev
,
next
;
int
index
,
prev
,
next
;
LCS_DBF_TEXT
(
5
,
trace
,
"prcsbuff"
);
LCS_DBF_TEXT
(
5
,
trace
,
"prcsbuff"
);
BUG_ON
(
buffer
->
state
!=
BUF_STATE_READY
);
if
(
buffer
->
state
!=
BUF_STATE_READY
)
BUG
();
buffer
->
state
=
BUF_STATE_PROCESSED
;
buffer
->
state
=
BUF_STATE_PROCESSED
;
index
=
buffer
-
channel
->
iob
;
index
=
buffer
-
channel
->
iob
;
prev
=
(
index
-
1
)
&
(
LCS_NUM_BUFFS
-
1
);
prev
=
(
index
-
1
)
&
(
LCS_NUM_BUFFS
-
1
);
...
@@ -732,8 +729,9 @@ lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
...
@@ -732,8 +729,9 @@ lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
unsigned
long
flags
;
unsigned
long
flags
;
LCS_DBF_TEXT
(
5
,
trace
,
"relbuff"
);
LCS_DBF_TEXT
(
5
,
trace
,
"relbuff"
);
BUG_ON
(
buffer
->
state
!=
BUF_STATE_LOCKED
&&
if
(
buffer
->
state
!=
BUF_STATE_LOCKED
&&
buffer
->
state
!=
BUF_STATE_PROCESSED
);
buffer
->
state
!=
BUF_STATE_PROCESSED
)
BUG
();
spin_lock_irqsave
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
spin_lock_irqsave
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
buffer
->
state
=
BUF_STATE_EMPTY
;
buffer
->
state
=
BUF_STATE_EMPTY
;
spin_unlock_irqrestore
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
spin_unlock_irqrestore
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
...
@@ -1147,8 +1145,6 @@ lcs_fix_multicast_list(struct lcs_card *card)
...
@@ -1147,8 +1145,6 @@ lcs_fix_multicast_list(struct lcs_card *card)
list_add_tail
(
&
ipm
->
list
,
&
card
->
ipm_list
);
list_add_tail
(
&
ipm
->
list
,
&
card
->
ipm_list
);
}
}
spin_unlock_irqrestore
(
&
card
->
ipm_lock
,
flags
);
spin_unlock_irqrestore
(
&
card
->
ipm_lock
,
flags
);
if
(
card
->
state
==
DEV_STATE_UP
)
netif_wake_queue
(
card
->
dev
);
}
}
/**
/**
...
@@ -1231,17 +1227,17 @@ lcs_set_mc_addresses(struct lcs_card *card, struct in_device *in4_dev)
...
@@ -1231,17 +1227,17 @@ lcs_set_mc_addresses(struct lcs_card *card, struct in_device *in4_dev)
if
(
ipm
!=
NULL
)
if
(
ipm
!=
NULL
)
continue
;
/* Address already in list. */
continue
;
/* Address already in list. */
ipm
=
(
struct
lcs_ipm_list
*
)
ipm
=
(
struct
lcs_ipm_list
*
)
k
m
alloc
(
sizeof
(
struct
lcs_ipm_list
),
GFP_ATOMIC
);
k
z
alloc
(
sizeof
(
struct
lcs_ipm_list
),
GFP_ATOMIC
);
if
(
ipm
==
NULL
)
{
if
(
ipm
==
NULL
)
{
PRINT_INFO
(
"Not enough memory to add "
PRINT_INFO
(
"Not enough memory to add "
"new multicast entry!
\n
"
);
"new multicast entry!
\n
"
);
break
;
break
;
}
}
memset
(
ipm
,
0
,
sizeof
(
struct
lcs_ipm_list
));
memcpy
(
&
ipm
->
ipm
.
mac_addr
,
buf
,
LCS_MAC_LENGTH
);
memcpy
(
&
ipm
->
ipm
.
mac_addr
,
buf
,
LCS_MAC_LENGTH
);
ipm
->
ipm
.
ip_addr
=
im4
->
multiaddr
;
ipm
->
ipm
.
ip_addr
=
im4
->
multiaddr
;
ipm
->
ipm_state
=
LCS_IPM_STATE_SET_REQUIRED
;
ipm
->
ipm_state
=
LCS_IPM_STATE_SET_REQUIRED
;
spin_lock_irqsave
(
&
card
->
ipm_lock
,
flags
);
spin_lock_irqsave
(
&
card
->
ipm_lock
,
flags
);
LCS_DBF_HEX
(
2
,
trace
,
&
ipm
->
ipm
.
ip_addr
,
4
);
list_add
(
&
ipm
->
list
,
&
card
->
ipm_list
);
list_add
(
&
ipm
->
list
,
&
card
->
ipm_list
);
spin_unlock_irqrestore
(
&
card
->
ipm_lock
,
flags
);
spin_unlock_irqrestore
(
&
card
->
ipm_lock
,
flags
);
}
}
...
@@ -1269,7 +1265,15 @@ lcs_register_mc_addresses(void *data)
...
@@ -1269,7 +1265,15 @@ lcs_register_mc_addresses(void *data)
read_unlock
(
&
in4_dev
->
mc_list_lock
);
read_unlock
(
&
in4_dev
->
mc_list_lock
);
in_dev_put
(
in4_dev
);
in_dev_put
(
in4_dev
);
netif_carrier_off
(
card
->
dev
);
netif_tx_disable
(
card
->
dev
);
wait_event
(
card
->
write
.
wait_q
,
(
card
->
write
.
state
!=
CH_STATE_RUNNING
));
lcs_fix_multicast_list
(
card
);
lcs_fix_multicast_list
(
card
);
if
(
card
->
state
==
DEV_STATE_UP
)
{
netif_carrier_on
(
card
->
dev
);
netif_wake_queue
(
card
->
dev
);
}
out:
out:
lcs_clear_thread_running_bit
(
card
,
LCS_SET_MC_THREAD
);
lcs_clear_thread_running_bit
(
card
,
LCS_SET_MC_THREAD
);
return
0
;
return
0
;
...
@@ -1286,7 +1290,7 @@ lcs_set_multicast_list(struct net_device *dev)
...
@@ -1286,7 +1290,7 @@ lcs_set_multicast_list(struct net_device *dev)
LCS_DBF_TEXT
(
4
,
trace
,
"setmulti"
);
LCS_DBF_TEXT
(
4
,
trace
,
"setmulti"
);
card
=
(
struct
lcs_card
*
)
dev
->
priv
;
card
=
(
struct
lcs_card
*
)
dev
->
priv
;
if
(
!
lcs_set_thread_start_bit
(
card
,
LCS_SET_MC_THREAD
))
if
(
!
lcs_set_thread_start_bit
(
card
,
LCS_SET_MC_THREAD
))
schedule_work
(
&
card
->
kernel_thread_starter
);
schedule_work
(
&
card
->
kernel_thread_starter
);
}
}
...
@@ -1318,6 +1322,53 @@ lcs_check_irb_error(struct ccw_device *cdev, struct irb *irb)
...
@@ -1318,6 +1322,53 @@ lcs_check_irb_error(struct ccw_device *cdev, struct irb *irb)
return
PTR_ERR
(
irb
);
return
PTR_ERR
(
irb
);
}
}
static
int
lcs_get_problem
(
struct
ccw_device
*
cdev
,
struct
irb
*
irb
)
{
int
dstat
,
cstat
;
char
*
sense
;
sense
=
(
char
*
)
irb
->
ecw
;
cstat
=
irb
->
scsw
.
cstat
;
dstat
=
irb
->
scsw
.
dstat
;
if
(
cstat
&
(
SCHN_STAT_CHN_CTRL_CHK
|
SCHN_STAT_INTF_CTRL_CHK
|
SCHN_STAT_CHN_DATA_CHK
|
SCHN_STAT_CHAIN_CHECK
|
SCHN_STAT_PROT_CHECK
|
SCHN_STAT_PROG_CHECK
))
{
LCS_DBF_TEXT
(
2
,
trace
,
"CGENCHK"
);
return
1
;
}
if
(
dstat
&
DEV_STAT_UNIT_CHECK
)
{
if
(
sense
[
LCS_SENSE_BYTE_1
]
&
LCS_SENSE_RESETTING_EVENT
)
{
LCS_DBF_TEXT
(
2
,
trace
,
"REVIND"
);
return
1
;
}
if
(
sense
[
LCS_SENSE_BYTE_0
]
&
LCS_SENSE_CMD_REJECT
)
{
LCS_DBF_TEXT
(
2
,
trace
,
"CMDREJ"
);
return
0
;
}
if
((
!
sense
[
LCS_SENSE_BYTE_0
])
&&
(
!
sense
[
LCS_SENSE_BYTE_1
])
&&
(
!
sense
[
LCS_SENSE_BYTE_2
])
&&
(
!
sense
[
LCS_SENSE_BYTE_3
]))
{
LCS_DBF_TEXT
(
2
,
trace
,
"ZEROSEN"
);
return
0
;
}
LCS_DBF_TEXT
(
2
,
trace
,
"DGENCHK"
);
return
1
;
}
return
0
;
}
void
lcs_schedule_recovery
(
struct
lcs_card
*
card
)
{
LCS_DBF_TEXT
(
2
,
trace
,
"startrec"
);
if
(
!
lcs_set_thread_start_bit
(
card
,
LCS_RECOVERY_THREAD
))
schedule_work
(
&
card
->
kernel_thread_starter
);
}
/**
/**
* IRQ Handler for LCS channels
* IRQ Handler for LCS channels
...
@@ -1327,7 +1378,8 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
...
@@ -1327,7 +1378,8 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
{
{
struct
lcs_card
*
card
;
struct
lcs_card
*
card
;
struct
lcs_channel
*
channel
;
struct
lcs_channel
*
channel
;
int
index
;
int
rc
,
index
;
int
cstat
,
dstat
;
if
(
lcs_check_irb_error
(
cdev
,
irb
))
if
(
lcs_check_irb_error
(
cdev
,
irb
))
return
;
return
;
...
@@ -1338,14 +1390,27 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
...
@@ -1338,14 +1390,27 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
else
else
channel
=
&
card
->
write
;
channel
=
&
card
->
write
;
cstat
=
irb
->
scsw
.
cstat
;
dstat
=
irb
->
scsw
.
dstat
;
LCS_DBF_TEXT_
(
5
,
trace
,
"Rint%s"
,
cdev
->
dev
.
bus_id
);
LCS_DBF_TEXT_
(
5
,
trace
,
"Rint%s"
,
cdev
->
dev
.
bus_id
);
LCS_DBF_TEXT_
(
5
,
trace
,
"%4x%4x"
,
irb
->
scsw
.
cstat
,
irb
->
scsw
.
dstat
);
LCS_DBF_TEXT_
(
5
,
trace
,
"%4x%4x"
,
irb
->
scsw
.
cstat
,
irb
->
scsw
.
dstat
);
LCS_DBF_TEXT_
(
5
,
trace
,
"%4x%4x"
,
irb
->
scsw
.
fctl
,
irb
->
scsw
.
actl
);
LCS_DBF_TEXT_
(
5
,
trace
,
"%4x%4x"
,
irb
->
scsw
.
fctl
,
irb
->
scsw
.
actl
);
/* Check for channel and device errors presented */
rc
=
lcs_get_problem
(
cdev
,
irb
);
if
(
rc
||
(
dstat
&
DEV_STAT_UNIT_EXCEP
))
{
PRINT_WARN
(
"check on device %s, dstat=0x%X, cstat=0x%X
\n
"
,
cdev
->
dev
.
bus_id
,
dstat
,
cstat
);
if
(
rc
)
{
lcs_schedule_recovery
(
card
);
wake_up
(
&
card
->
wait_q
);
return
;
}
}
/* How far in the ccw chain have we processed? */
/* How far in the ccw chain have we processed? */
if
((
channel
->
state
!=
CH_STATE_INIT
)
&&
if
((
channel
->
state
!=
CH_STATE_INIT
)
&&
(
irb
->
scsw
.
fctl
&
SCSW_FCTL_START_FUNC
))
{
(
irb
->
scsw
.
fctl
&
SCSW_FCTL_START_FUNC
))
{
index
=
(
struct
ccw1
*
)
__va
((
addr_t
)
irb
->
scsw
.
cpa
)
index
=
(
struct
ccw1
*
)
__va
((
addr_t
)
irb
->
scsw
.
cpa
)
-
channel
->
ccws
;
-
channel
->
ccws
;
if
((
irb
->
scsw
.
actl
&
SCSW_ACTL_SUSPENDED
)
||
if
((
irb
->
scsw
.
actl
&
SCSW_ACTL_SUSPENDED
)
||
(
irb
->
scsw
.
cstat
&
SCHN_STAT_PCI
))
(
irb
->
scsw
.
cstat
&
SCHN_STAT_PCI
))
...
@@ -1367,7 +1432,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
...
@@ -1367,7 +1432,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
else
if
(
irb
->
scsw
.
actl
&
SCSW_ACTL_SUSPENDED
)
else
if
(
irb
->
scsw
.
actl
&
SCSW_ACTL_SUSPENDED
)
/* CCW execution stopped on a suspend bit. */
/* CCW execution stopped on a suspend bit. */
channel
->
state
=
CH_STATE_SUSPENDED
;
channel
->
state
=
CH_STATE_SUSPENDED
;
if
(
irb
->
scsw
.
fctl
&
SCSW_FCTL_HALT_FUNC
)
{
if
(
irb
->
scsw
.
fctl
&
SCSW_FCTL_HALT_FUNC
)
{
if
(
irb
->
scsw
.
cc
!=
0
)
{
if
(
irb
->
scsw
.
cc
!=
0
)
{
ccw_device_halt
(
channel
->
ccwdev
,
(
addr_t
)
channel
);
ccw_device_halt
(
channel
->
ccwdev
,
(
addr_t
)
channel
);
...
@@ -1376,7 +1440,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
...
@@ -1376,7 +1440,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
/* The channel has been stopped by halt_IO. */
/* The channel has been stopped by halt_IO. */
channel
->
state
=
CH_STATE_HALTED
;
channel
->
state
=
CH_STATE_HALTED
;
}
}
if
(
irb
->
scsw
.
fctl
&
SCSW_FCTL_CLEAR_FUNC
)
{
if
(
irb
->
scsw
.
fctl
&
SCSW_FCTL_CLEAR_FUNC
)
{
channel
->
state
=
CH_STATE_CLEARED
;
channel
->
state
=
CH_STATE_CLEARED
;
}
}
...
@@ -1452,7 +1515,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
...
@@ -1452,7 +1515,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
lcs_release_buffer
(
channel
,
buffer
);
lcs_release_buffer
(
channel
,
buffer
);
card
=
(
struct
lcs_card
*
)
card
=
(
struct
lcs_card
*
)
((
char
*
)
channel
-
offsetof
(
struct
lcs_card
,
write
));
((
char
*
)
channel
-
offsetof
(
struct
lcs_card
,
write
));
if
(
netif_queue_stopped
(
card
->
dev
))
if
(
netif_queue_stopped
(
card
->
dev
)
&&
netif_carrier_ok
(
card
->
dev
)
)
netif_wake_queue
(
card
->
dev
);
netif_wake_queue
(
card
->
dev
);
spin_lock
(
&
card
->
lock
);
spin_lock
(
&
card
->
lock
);
card
->
tx_emitted
--
;
card
->
tx_emitted
--
;
...
@@ -1488,6 +1551,10 @@ __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb,
...
@@ -1488,6 +1551,10 @@ __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb,
card
->
stats
.
tx_carrier_errors
++
;
card
->
stats
.
tx_carrier_errors
++
;
return
0
;
return
0
;
}
}
if
(
skb
->
protocol
==
htons
(
ETH_P_IPV6
))
{
dev_kfree_skb
(
skb
);
return
0
;
}
netif_stop_queue
(
card
->
dev
);
netif_stop_queue
(
card
->
dev
);
spin_lock
(
&
card
->
lock
);
spin_lock
(
&
card
->
lock
);
if
(
card
->
tx_buffer
!=
NULL
&&
if
(
card
->
tx_buffer
!=
NULL
&&
...
@@ -1632,30 +1699,6 @@ lcs_detect(struct lcs_card *card)
...
@@ -1632,30 +1699,6 @@ lcs_detect(struct lcs_card *card)
return
rc
;
return
rc
;
}
}
/**
* reset card
*/
static
int
lcs_resetcard
(
struct
lcs_card
*
card
)
{
int
retries
;
LCS_DBF_TEXT
(
2
,
trace
,
"rescard"
);
for
(
retries
=
0
;
retries
<
10
;
retries
++
)
{
if
(
lcs_detect
(
card
)
==
0
)
{
netif_wake_queue
(
card
->
dev
);
card
->
state
=
DEV_STATE_UP
;
PRINT_INFO
(
"LCS device %s successfully restarted!
\n
"
,
card
->
dev
->
name
);
return
0
;
}
msleep
(
3000
);
}
PRINT_ERR
(
"Error in Reseting LCS card!
\n
"
);
return
-
EIO
;
}
/**
/**
* LCS Stop card
* LCS Stop card
*/
*/
...
@@ -1679,111 +1722,6 @@ lcs_stopcard(struct lcs_card *card)
...
@@ -1679,111 +1722,6 @@ lcs_stopcard(struct lcs_card *card)
return
rc
;
return
rc
;
}
}
/**
* LGW initiated commands
*/
static
int
lcs_lgw_startlan_thread
(
void
*
data
)
{
struct
lcs_card
*
card
;
card
=
(
struct
lcs_card
*
)
data
;
daemonize
(
"lgwstpln"
);
if
(
!
lcs_do_run_thread
(
card
,
LCS_STARTLAN_THREAD
))
return
0
;
LCS_DBF_TEXT
(
4
,
trace
,
"lgwstpln"
);
if
(
card
->
dev
)
netif_stop_queue
(
card
->
dev
);
if
(
lcs_startlan
(
card
)
==
0
)
{
netif_wake_queue
(
card
->
dev
);
card
->
state
=
DEV_STATE_UP
;
PRINT_INFO
(
"LCS Startlan for device %s succeeded!
\n
"
,
card
->
dev
->
name
);
}
else
PRINT_ERR
(
"LCS Startlan for device %s failed!
\n
"
,
card
->
dev
->
name
);
lcs_clear_thread_running_bit
(
card
,
LCS_STARTLAN_THREAD
);
return
0
;
}
/**
* Send startup command initiated by Lan Gateway
*/
static
int
lcs_lgw_startup_thread
(
void
*
data
)
{
int
rc
;
struct
lcs_card
*
card
;
card
=
(
struct
lcs_card
*
)
data
;
daemonize
(
"lgwstaln"
);
if
(
!
lcs_do_run_thread
(
card
,
LCS_STARTUP_THREAD
))
return
0
;
LCS_DBF_TEXT
(
4
,
trace
,
"lgwstaln"
);
if
(
card
->
dev
)
netif_stop_queue
(
card
->
dev
);
rc
=
lcs_send_startup
(
card
,
LCS_INITIATOR_LGW
);
if
(
rc
!=
0
)
{
PRINT_ERR
(
"Startup for LCS device %s initiated "
\
"by LGW failed!
\n
Reseting card ...
\n
"
,
card
->
dev
->
name
);
/* do a card reset */
rc
=
lcs_resetcard
(
card
);
if
(
rc
==
0
)
goto
Done
;
}
rc
=
lcs_startlan
(
card
);
if
(
rc
==
0
)
{
netif_wake_queue
(
card
->
dev
);
card
->
state
=
DEV_STATE_UP
;
}
Done:
if
(
rc
==
0
)
PRINT_INFO
(
"LCS Startup for device %s succeeded!
\n
"
,
card
->
dev
->
name
);
else
PRINT_ERR
(
"LCS Startup for device %s failed!
\n
"
,
card
->
dev
->
name
);
lcs_clear_thread_running_bit
(
card
,
LCS_STARTUP_THREAD
);
return
0
;
}
/**
* send stoplan command initiated by Lan Gateway
*/
static
int
lcs_lgw_stoplan_thread
(
void
*
data
)
{
struct
lcs_card
*
card
;
int
rc
;
card
=
(
struct
lcs_card
*
)
data
;
daemonize
(
"lgwstop"
);
if
(
!
lcs_do_run_thread
(
card
,
LCS_STOPLAN_THREAD
))
return
0
;
LCS_DBF_TEXT
(
4
,
trace
,
"lgwstop"
);
if
(
card
->
dev
)
netif_stop_queue
(
card
->
dev
);
if
(
lcs_send_stoplan
(
card
,
LCS_INITIATOR_LGW
)
==
0
)
PRINT_INFO
(
"Stoplan for %s initiated by LGW succeeded!
\n
"
,
card
->
dev
->
name
);
else
PRINT_ERR
(
"Stoplan %s initiated by LGW failed!
\n
"
,
card
->
dev
->
name
);
/*Try to reset the card, stop it on failure */
rc
=
lcs_resetcard
(
card
);
if
(
rc
!=
0
)
rc
=
lcs_stopcard
(
card
);
lcs_clear_thread_running_bit
(
card
,
LCS_STOPLAN_THREAD
);
return
rc
;
}
/**
/**
* Kernel Thread helper functions for LGW initiated commands
* Kernel Thread helper functions for LGW initiated commands
*/
*/
...
@@ -1791,15 +1729,12 @@ static void
...
@@ -1791,15 +1729,12 @@ static void
lcs_start_kernel_thread
(
struct
lcs_card
*
card
)
lcs_start_kernel_thread
(
struct
lcs_card
*
card
)
{
{
LCS_DBF_TEXT
(
5
,
trace
,
"krnthrd"
);
LCS_DBF_TEXT
(
5
,
trace
,
"krnthrd"
);
if
(
lcs_do_start_thread
(
card
,
LCS_STARTUP_THREAD
))
if
(
lcs_do_start_thread
(
card
,
LCS_RECOVERY_THREAD
))
kernel_thread
(
lcs_lgw_startup_thread
,
(
void
*
)
card
,
SIGCHLD
);
kernel_thread
(
lcs_recovery
,
(
void
*
)
card
,
SIGCHLD
);
if
(
lcs_do_start_thread
(
card
,
LCS_STARTLAN_THREAD
))
kernel_thread
(
lcs_lgw_startlan_thread
,
(
void
*
)
card
,
SIGCHLD
);
if
(
lcs_do_start_thread
(
card
,
LCS_STOPLAN_THREAD
))
kernel_thread
(
lcs_lgw_stoplan_thread
,
(
void
*
)
card
,
SIGCHLD
);
#ifdef CONFIG_IP_MULTICAST
#ifdef CONFIG_IP_MULTICAST
if
(
lcs_do_start_thread
(
card
,
LCS_SET_MC_THREAD
))
if
(
lcs_do_start_thread
(
card
,
LCS_SET_MC_THREAD
))
kernel_thread
(
lcs_register_mc_addresses
,
(
void
*
)
card
,
SIGCHLD
);
kernel_thread
(
lcs_register_mc_addresses
,
(
void
*
)
card
,
SIGCHLD
);
#endif
#endif
}
}
...
@@ -1813,19 +1748,14 @@ lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd)
...
@@ -1813,19 +1748,14 @@ lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd)
if
(
cmd
->
initiator
==
LCS_INITIATOR_LGW
)
{
if
(
cmd
->
initiator
==
LCS_INITIATOR_LGW
)
{
switch
(
cmd
->
cmd_code
)
{
switch
(
cmd
->
cmd_code
)
{
case
LCS_CMD_STARTUP
:
case
LCS_CMD_STARTUP
:
if
(
!
lcs_set_thread_start_bit
(
card
,
LCS_STARTUP_THREAD
))
schedule_work
(
&
card
->
kernel_thread_starter
);
break
;
case
LCS_CMD_STARTLAN
:
case
LCS_CMD_STARTLAN
:
if
(
!
lcs_set_thread_start_bit
(
card
,
lcs_schedule_recovery
(
card
);
LCS_STARTLAN_THREAD
))
schedule_work
(
&
card
->
kernel_thread_starter
);
break
;
break
;
case
LCS_CMD_STOPLAN
:
case
LCS_CMD_STOPLAN
:
if
(
!
lcs_set_thread_start_bit
(
card
,
PRINT_WARN
(
"Stoplan for %s initiated by LGW.
\n
"
,
LCS_STOPLAN_THREAD
))
card
->
dev
->
name
);
schedule_work
(
&
card
->
kernel_thread_starter
);
if
(
card
->
dev
)
netif_carrier_off
(
card
->
dev
);
break
;
break
;
default:
default:
PRINT_INFO
(
"UNRECOGNIZED LGW COMMAND
\n
"
);
PRINT_INFO
(
"UNRECOGNIZED LGW COMMAND
\n
"
);
...
@@ -1941,8 +1871,11 @@ lcs_stop_device(struct net_device *dev)
...
@@ -1941,8 +1871,11 @@ lcs_stop_device(struct net_device *dev)
LCS_DBF_TEXT
(
2
,
trace
,
"stopdev"
);
LCS_DBF_TEXT
(
2
,
trace
,
"stopdev"
);
card
=
(
struct
lcs_card
*
)
dev
->
priv
;
card
=
(
struct
lcs_card
*
)
dev
->
priv
;
netif_stop_queue
(
dev
);
netif_carrier_off
(
dev
);
netif_tx_disable
(
dev
);
dev
->
flags
&=
~
IFF_UP
;
dev
->
flags
&=
~
IFF_UP
;
wait_event
(
card
->
write
.
wait_q
,
(
card
->
write
.
state
!=
CH_STATE_RUNNING
));
rc
=
lcs_stopcard
(
card
);
rc
=
lcs_stopcard
(
card
);
if
(
rc
)
if
(
rc
)
PRINT_ERR
(
"Try it again!
\n
"
);
PRINT_ERR
(
"Try it again!
\n
"
);
...
@@ -1968,6 +1901,7 @@ lcs_open_device(struct net_device *dev)
...
@@ -1968,6 +1901,7 @@ lcs_open_device(struct net_device *dev)
}
else
{
}
else
{
dev
->
flags
|=
IFF_UP
;
dev
->
flags
|=
IFF_UP
;
netif_carrier_on
(
dev
);
netif_wake_queue
(
dev
);
netif_wake_queue
(
dev
);
card
->
state
=
DEV_STATE_UP
;
card
->
state
=
DEV_STATE_UP
;
}
}
...
@@ -2059,10 +1993,31 @@ lcs_timeout_store (struct device *dev, struct device_attribute *attr, const char
...
@@ -2059,10 +1993,31 @@ lcs_timeout_store (struct device *dev, struct device_attribute *attr, const char
DEVICE_ATTR
(
lancmd_timeout
,
0644
,
lcs_timeout_show
,
lcs_timeout_store
);
DEVICE_ATTR
(
lancmd_timeout
,
0644
,
lcs_timeout_show
,
lcs_timeout_store
);
static
ssize_t
lcs_dev_recover_store
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
lcs_card
*
card
=
dev
->
driver_data
;
char
*
tmp
;
int
i
;
if
(
!
card
)
return
-
EINVAL
;
if
(
card
->
state
!=
DEV_STATE_UP
)
return
-
EPERM
;
i
=
simple_strtoul
(
buf
,
&
tmp
,
16
);
if
(
i
==
1
)
lcs_schedule_recovery
(
card
);
return
count
;
}
static
DEVICE_ATTR
(
recover
,
0200
,
NULL
,
lcs_dev_recover_store
);
static
struct
attribute
*
lcs_attrs
[]
=
{
static
struct
attribute
*
lcs_attrs
[]
=
{
&
dev_attr_portno
.
attr
,
&
dev_attr_portno
.
attr
,
&
dev_attr_type
.
attr
,
&
dev_attr_type
.
attr
,
&
dev_attr_lancmd_timeout
.
attr
,
&
dev_attr_lancmd_timeout
.
attr
,
&
dev_attr_recover
.
attr
,
NULL
,
NULL
,
};
};
...
@@ -2099,6 +2054,12 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev)
...
@@ -2099,6 +2054,12 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev)
ccwgdev
->
dev
.
driver_data
=
card
;
ccwgdev
->
dev
.
driver_data
=
card
;
ccwgdev
->
cdev
[
0
]
->
handler
=
lcs_irq
;
ccwgdev
->
cdev
[
0
]
->
handler
=
lcs_irq
;
ccwgdev
->
cdev
[
1
]
->
handler
=
lcs_irq
;
ccwgdev
->
cdev
[
1
]
->
handler
=
lcs_irq
;
card
->
gdev
=
ccwgdev
;
INIT_WORK
(
&
card
->
kernel_thread_starter
,
(
void
*
)
lcs_start_kernel_thread
,
card
);
card
->
thread_start_mask
=
0
;
card
->
thread_allowed_mask
=
0
;
card
->
thread_running_mask
=
0
;
return
0
;
return
0
;
}
}
...
@@ -2200,6 +2161,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
...
@@ -2200,6 +2161,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
if
(
recover_state
==
DEV_STATE_RECOVER
)
{
if
(
recover_state
==
DEV_STATE_RECOVER
)
{
lcs_set_multicast_list
(
card
->
dev
);
lcs_set_multicast_list
(
card
->
dev
);
card
->
dev
->
flags
|=
IFF_UP
;
card
->
dev
->
flags
|=
IFF_UP
;
netif_carrier_on
(
card
->
dev
);
netif_wake_queue
(
card
->
dev
);
netif_wake_queue
(
card
->
dev
);
card
->
state
=
DEV_STATE_UP
;
card
->
state
=
DEV_STATE_UP
;
}
else
{
}
else
{
...
@@ -2229,7 +2191,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
...
@@ -2229,7 +2191,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
* lcs_shutdown_device, called when setting the group device offline.
* lcs_shutdown_device, called when setting the group device offline.
*/
*/
static
int
static
int
lcs_shutdown_device
(
struct
ccwgroup_device
*
ccwgdev
)
__lcs_shutdown_device
(
struct
ccwgroup_device
*
ccwgdev
,
int
recovery_mode
)
{
{
struct
lcs_card
*
card
;
struct
lcs_card
*
card
;
enum
lcs_dev_states
recover_state
;
enum
lcs_dev_states
recover_state
;
...
@@ -2239,9 +2201,11 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
...
@@ -2239,9 +2201,11 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
card
=
(
struct
lcs_card
*
)
ccwgdev
->
dev
.
driver_data
;
card
=
(
struct
lcs_card
*
)
ccwgdev
->
dev
.
driver_data
;
if
(
!
card
)
if
(
!
card
)
return
-
ENODEV
;
return
-
ENODEV
;
lcs_set_allowed_threads
(
card
,
0
);
if
(
recovery_mode
==
0
)
{
if
(
lcs_wait_for_threads
(
card
,
LCS_SET_MC_THREAD
))
lcs_set_allowed_threads
(
card
,
0
);
return
-
ERESTARTSYS
;
if
(
lcs_wait_for_threads
(
card
,
LCS_SET_MC_THREAD
))
return
-
ERESTARTSYS
;
}
LCS_DBF_HEX
(
3
,
setup
,
&
card
,
sizeof
(
void
*
));
LCS_DBF_HEX
(
3
,
setup
,
&
card
,
sizeof
(
void
*
));
recover_state
=
card
->
state
;
recover_state
=
card
->
state
;
...
@@ -2256,6 +2220,43 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
...
@@ -2256,6 +2220,43 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
return
0
;
return
0
;
}
}
static
int
lcs_shutdown_device
(
struct
ccwgroup_device
*
ccwgdev
)
{
return
__lcs_shutdown_device
(
ccwgdev
,
0
);
}
/**
* drive lcs recovery after startup and startlan initiated by Lan Gateway
*/
static
int
lcs_recovery
(
void
*
ptr
)
{
struct
lcs_card
*
card
;
struct
ccwgroup_device
*
gdev
;
int
rc
;
card
=
(
struct
lcs_card
*
)
ptr
;
daemonize
(
"lcs_recover"
);
LCS_DBF_TEXT
(
4
,
trace
,
"recover1"
);
if
(
!
lcs_do_run_thread
(
card
,
LCS_RECOVERY_THREAD
))
return
0
;
LCS_DBF_TEXT
(
4
,
trace
,
"recover2"
);
gdev
=
card
->
gdev
;
PRINT_WARN
(
"Recovery of device %s started...
\n
"
,
gdev
->
dev
.
bus_id
);
rc
=
__lcs_shutdown_device
(
gdev
,
1
);
rc
=
lcs_new_device
(
gdev
);
if
(
!
rc
)
PRINT_INFO
(
"Device %s successfully recovered!
\n
"
,
card
->
dev
->
name
);
else
PRINT_INFO
(
"Device %s could not be recovered!
\n
"
,
card
->
dev
->
name
);
lcs_clear_thread_running_bit
(
card
,
LCS_RECOVERY_THREAD
);
return
0
;
}
/**
/**
* lcs_remove_device, free buffers and card
* lcs_remove_device, free buffers and card
*/
*/
...
...
drivers/s390/net/lcs.h
View file @
983f27d3
...
@@ -73,13 +73,17 @@ do { \
...
@@ -73,13 +73,17 @@ do { \
/**
/**
* LCS sense byte definitions
* LCS sense byte definitions
*/
*/
#define LCS_SENSE_BYTE_0 0
#define LCS_SENSE_BYTE_1 1
#define LCS_SENSE_BYTE_2 2
#define LCS_SENSE_BYTE_3 3
#define LCS_SENSE_INTERFACE_DISCONNECT 0x01
#define LCS_SENSE_INTERFACE_DISCONNECT 0x01
#define LCS_SENSE_EQUIPMENT_CHECK 0x10
#define LCS_SENSE_EQUIPMENT_CHECK 0x10
#define LCS_SENSE_BUS_OUT_CHECK 0x20
#define LCS_SENSE_BUS_OUT_CHECK 0x20
#define LCS_SENSE_INTERVENTION_REQUIRED 0x40
#define LCS_SENSE_INTERVENTION_REQUIRED 0x40
#define LCS_SENSE_CMD_REJECT 0x80
#define LCS_SENSE_CMD_REJECT 0x80
#define LCS_SENSE_RESETTING_EVENT 0x
00
80
#define LCS_SENSE_RESETTING_EVENT 0x80
#define LCS_SENSE_DEVICE_ONLINE 0x
00
20
#define LCS_SENSE_DEVICE_ONLINE 0x20
/**
/**
* LCS packet type definitions
* LCS packet type definitions
...
@@ -152,10 +156,9 @@ enum lcs_dev_states {
...
@@ -152,10 +156,9 @@ enum lcs_dev_states {
enum
lcs_threads
{
enum
lcs_threads
{
LCS_SET_MC_THREAD
=
1
,
LCS_SET_MC_THREAD
=
1
,
LCS_STARTLAN_THREAD
=
2
,
LCS_RECOVERY_THREAD
=
2
,
LCS_STOPLAN_THREAD
=
4
,
LCS_STARTUP_THREAD
=
8
,
};
};
/**
/**
* LCS struct declarations
* LCS struct declarations
*/
*/
...
@@ -286,6 +289,7 @@ struct lcs_card {
...
@@ -286,6 +289,7 @@ struct lcs_card {
struct
net_device_stats
stats
;
struct
net_device_stats
stats
;
unsigned
short
(
*
lan_type_trans
)(
struct
sk_buff
*
skb
,
unsigned
short
(
*
lan_type_trans
)(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
);
struct
net_device
*
dev
);
struct
ccwgroup_device
*
gdev
;
struct
lcs_channel
read
;
struct
lcs_channel
read
;
struct
lcs_channel
write
;
struct
lcs_channel
write
;
struct
lcs_buffer
*
tx_buffer
;
struct
lcs_buffer
*
tx_buffer
;
...
...
drivers/s390/net/netiucv.c
View file @
983f27d3
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*
*/
*/
#undef DEBUG
#undef DEBUG
#include <linux/module.h>
#include <linux/module.h>
...
@@ -65,7 +65,7 @@ MODULE_AUTHOR
...
@@ -65,7 +65,7 @@ MODULE_AUTHOR
(
"(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)"
);
(
"(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)"
);
MODULE_DESCRIPTION
(
"Linux for S/390 IUCV network driver"
);
MODULE_DESCRIPTION
(
"Linux for S/390 IUCV network driver"
);
#define PRINTK_HEADER " iucv: "
/* for debugging */
#define PRINTK_HEADER " iucv: "
/* for debugging */
static
struct
device_driver
netiucv_driver
=
{
static
struct
device_driver
netiucv_driver
=
{
...
@@ -202,7 +202,7 @@ netiucv_printname(char *name)
...
@@ -202,7 +202,7 @@ netiucv_printname(char *name)
*
p
=
'\0'
;
*
p
=
'\0'
;
return
tmp
;
return
tmp
;
}
}
/**
/**
* States of the interface statemachine.
* States of the interface statemachine.
*/
*/
...
@@ -244,7 +244,7 @@ static const char *dev_event_names[] = {
...
@@ -244,7 +244,7 @@ static const char *dev_event_names[] = {
"Connection up"
,
"Connection up"
,
"Connection down"
,
"Connection down"
,
};
};
/**
/**
* Events of the connection statemachine
* Events of the connection statemachine
*/
*/
...
@@ -364,7 +364,7 @@ static const char *conn_state_names[] = {
...
@@ -364,7 +364,7 @@ static const char *conn_state_names[] = {
"Connect error"
,
"Connect error"
,
};
};
/**
/**
* Debug Facility Stuff
* Debug Facility Stuff
*/
*/
...
@@ -516,7 +516,7 @@ static void
...
@@ -516,7 +516,7 @@ static void
fsm_action_nop
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
fsm_action_nop
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
{
{
}
}
/**
/**
* Actions of the connection statemachine
* Actions of the connection statemachine
*****************************************************************************/
*****************************************************************************/
...
@@ -993,7 +993,7 @@ static const fsm_node conn_fsm[] = {
...
@@ -993,7 +993,7 @@ static const fsm_node conn_fsm[] = {
static
const
int
CONN_FSM_LEN
=
sizeof
(
conn_fsm
)
/
sizeof
(
fsm_node
);
static
const
int
CONN_FSM_LEN
=
sizeof
(
conn_fsm
)
/
sizeof
(
fsm_node
);
/**
/**
* Actions for interface - statemachine.
* Actions for interface - statemachine.
*****************************************************************************/
*****************************************************************************/
...
@@ -1182,7 +1182,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
...
@@ -1182,7 +1182,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
fsm_newstate
(
conn
->
fsm
,
CONN_STATE_TX
);
fsm_newstate
(
conn
->
fsm
,
CONN_STATE_TX
);
conn
->
prof
.
send_stamp
=
xtime
;
conn
->
prof
.
send_stamp
=
xtime
;
rc
=
iucv_send
(
conn
->
pathid
,
NULL
,
0
,
0
,
1
/* single_flag */
,
rc
=
iucv_send
(
conn
->
pathid
,
NULL
,
0
,
0
,
1
/* single_flag */
,
0
,
nskb
->
data
,
nskb
->
len
);
0
,
nskb
->
data
,
nskb
->
len
);
/* Shut up, gcc! nskb is always below 2G. */
/* Shut up, gcc! nskb is always below 2G. */
...
@@ -1220,7 +1220,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
...
@@ -1220,7 +1220,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
return
rc
;
return
rc
;
}
}
/**
/**
* Interface API for upper network layers
* Interface API for upper network layers
*****************************************************************************/
*****************************************************************************/
...
@@ -1291,7 +1291,7 @@ static int netiucv_tx(struct sk_buff *skb, struct net_device *dev)
...
@@ -1291,7 +1291,7 @@ static int netiucv_tx(struct sk_buff *skb, struct net_device *dev)
/**
/**
* If connection is not running, try to restart it
* If connection is not running, try to restart it
* and throw away packet.
* and throw away packet.
*/
*/
if
(
fsm_getstate
(
privptr
->
fsm
)
!=
DEV_STATE_RUNNING
)
{
if
(
fsm_getstate
(
privptr
->
fsm
)
!=
DEV_STATE_RUNNING
)
{
fsm_event
(
privptr
->
fsm
,
DEV_EVENT_START
,
dev
);
fsm_event
(
privptr
->
fsm
,
DEV_EVENT_START
,
dev
);
...
@@ -1538,7 +1538,7 @@ static ssize_t
...
@@ -1538,7 +1538,7 @@ static ssize_t
maxcq_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
maxcq_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
priv
->
conn
->
prof
.
maxcqueue
=
0
;
priv
->
conn
->
prof
.
maxcqueue
=
0
;
return
count
;
return
count
;
...
@@ -1559,7 +1559,7 @@ static ssize_t
...
@@ -1559,7 +1559,7 @@ static ssize_t
sdoio_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
sdoio_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
priv
->
conn
->
prof
.
doios_single
=
0
;
priv
->
conn
->
prof
.
doios_single
=
0
;
return
count
;
return
count
;
...
@@ -1580,7 +1580,7 @@ static ssize_t
...
@@ -1580,7 +1580,7 @@ static ssize_t
mdoio_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
mdoio_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
5
,
__FUNCTION__
);
IUCV_DBF_TEXT
(
trace
,
5
,
__FUNCTION__
);
priv
->
conn
->
prof
.
doios_multi
=
0
;
priv
->
conn
->
prof
.
doios_multi
=
0
;
return
count
;
return
count
;
...
@@ -1601,7 +1601,7 @@ static ssize_t
...
@@ -1601,7 +1601,7 @@ static ssize_t
txlen_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
txlen_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
priv
->
conn
->
prof
.
txlen
=
0
;
priv
->
conn
->
prof
.
txlen
=
0
;
return
count
;
return
count
;
...
@@ -1622,7 +1622,7 @@ static ssize_t
...
@@ -1622,7 +1622,7 @@ static ssize_t
txtime_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
txtime_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
priv
->
conn
->
prof
.
tx_time
=
0
;
priv
->
conn
->
prof
.
tx_time
=
0
;
return
count
;
return
count
;
...
@@ -2000,7 +2000,7 @@ conn_write(struct device_driver *drv, const char *buf, size_t count)
...
@@ -2000,7 +2000,7 @@ conn_write(struct device_driver *drv, const char *buf, size_t count)
}
}
PRINT_INFO
(
"%s: '%s'
\n
"
,
dev
->
name
,
netiucv_printname
(
username
));
PRINT_INFO
(
"%s: '%s'
\n
"
,
dev
->
name
,
netiucv_printname
(
username
));
return
count
;
return
count
;
out_free_ndev:
out_free_ndev:
...
@@ -2099,7 +2099,7 @@ static int __init
...
@@ -2099,7 +2099,7 @@ static int __init
netiucv_init
(
void
)
netiucv_init
(
void
)
{
{
int
ret
;
int
ret
;
ret
=
iucv_register_dbf_views
();
ret
=
iucv_register_dbf_views
();
if
(
ret
)
{
if
(
ret
)
{
PRINT_WARN
(
"netiucv_init failed, "
PRINT_WARN
(
"netiucv_init failed, "
...
@@ -2128,7 +2128,7 @@ netiucv_init(void)
...
@@ -2128,7 +2128,7 @@ netiucv_init(void)
}
}
return
ret
;
return
ret
;
}
}
module_init
(
netiucv_init
);
module_init
(
netiucv_init
);
module_exit
(
netiucv_exit
);
module_exit
(
netiucv_exit
);
MODULE_LICENSE
(
"GPL"
);
MODULE_LICENSE
(
"GPL"
);
drivers/s390/net/qeth.h
View file @
983f27d3
...
@@ -376,7 +376,7 @@ struct qeth_hdr_osn {
...
@@ -376,7 +376,7 @@ struct qeth_hdr_osn {
__u8
reserved3
[
18
];
__u8
reserved3
[
18
];
__u32
ccid
;
__u32
ccid
;
}
__attribute__
((
packed
));
}
__attribute__
((
packed
));
struct
qeth_hdr
{
struct
qeth_hdr
{
union
{
union
{
struct
qeth_hdr_layer2
l2
;
struct
qeth_hdr_layer2
l2
;
...
@@ -825,7 +825,7 @@ struct qeth_card {
...
@@ -825,7 +825,7 @@ struct qeth_card {
int
use_hard_stop
;
int
use_hard_stop
;
int
(
*
orig_hard_header
)(
struct
sk_buff
*
,
struct
net_device
*
,
int
(
*
orig_hard_header
)(
struct
sk_buff
*
,
struct
net_device
*
,
unsigned
short
,
void
*
,
void
*
,
unsigned
);
unsigned
short
,
void
*
,
void
*
,
unsigned
);
struct
qeth_osn_info
osn_info
;
struct
qeth_osn_info
osn_info
;
};
};
struct
qeth_card_list_struct
{
struct
qeth_card_list_struct
{
...
@@ -944,7 +944,7 @@ qeth_get_netdev_flags(struct qeth_card *card)
...
@@ -944,7 +944,7 @@ qeth_get_netdev_flags(struct qeth_card *card)
return
0
;
return
0
;
switch
(
card
->
info
.
type
)
{
switch
(
card
->
info
.
type
)
{
case
QETH_CARD_TYPE_IQD
:
case
QETH_CARD_TYPE_IQD
:
case
QETH_CARD_TYPE_OSN
:
case
QETH_CARD_TYPE_OSN
:
return
IFF_NOARP
;
return
IFF_NOARP
;
#ifdef CONFIG_QETH_IPV6
#ifdef CONFIG_QETH_IPV6
default:
default:
...
@@ -981,7 +981,7 @@ static inline int
...
@@ -981,7 +981,7 @@ static inline int
qeth_get_max_mtu_for_card
(
int
cardtype
)
qeth_get_max_mtu_for_card
(
int
cardtype
)
{
{
switch
(
cardtype
)
{
switch
(
cardtype
)
{
case
QETH_CARD_TYPE_UNKNOWN
:
case
QETH_CARD_TYPE_UNKNOWN
:
case
QETH_CARD_TYPE_OSAE
:
case
QETH_CARD_TYPE_OSAE
:
case
QETH_CARD_TYPE_OSN
:
case
QETH_CARD_TYPE_OSN
:
...
@@ -1097,9 +1097,9 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr)
...
@@ -1097,9 +1097,9 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr)
int
count
=
0
,
rc
=
0
;
int
count
=
0
,
rc
=
0
;
int
in
[
4
];
int
in
[
4
];
rc
=
sscanf
(
buf
,
"%d.%d.%d.%d%n"
,
rc
=
sscanf
(
buf
,
"%d.%d.%d.%d%n"
,
&
in
[
0
],
&
in
[
1
],
&
in
[
2
],
&
in
[
3
],
&
count
);
&
in
[
0
],
&
in
[
1
],
&
in
[
2
],
&
in
[
3
],
&
count
);
if
(
rc
!=
4
||
count
)
if
(
rc
!=
4
||
count
<=
0
)
return
-
EINVAL
;
return
-
EINVAL
;
for
(
count
=
0
;
count
<
4
;
count
++
)
{
for
(
count
=
0
;
count
<
4
;
count
++
)
{
if
(
in
[
count
]
>
255
)
if
(
in
[
count
]
>
255
)
...
@@ -1131,7 +1131,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
...
@@ -1131,7 +1131,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
cnt
=
out
=
found
=
save_cnt
=
num2
=
0
;
cnt
=
out
=
found
=
save_cnt
=
num2
=
0
;
end
=
start
=
(
char
*
)
buf
;
end
=
start
=
(
char
*
)
buf
;
in
=
(
__u16
*
)
addr
;
in
=
(
__u16
*
)
addr
;
memset
(
in
,
0
,
16
);
memset
(
in
,
0
,
16
);
while
(
end
)
{
while
(
end
)
{
end
=
strchr
(
end
,
':'
);
end
=
strchr
(
end
,
':'
);
...
@@ -1139,7 +1139,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
...
@@ -1139,7 +1139,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
end
=
(
char
*
)
buf
+
(
strlen
(
buf
));
end
=
(
char
*
)
buf
+
(
strlen
(
buf
));
out
=
1
;
out
=
1
;
}
}
if
((
end
-
start
))
{
if
((
end
-
start
))
{
memset
(
num
,
0
,
5
);
memset
(
num
,
0
,
5
);
memcpy
(
num
,
start
,
end
-
start
);
memcpy
(
num
,
start
,
end
-
start
);
if
(
!
qeth_isxdigit
(
num
))
if
(
!
qeth_isxdigit
(
num
))
...
@@ -1241,5 +1241,5 @@ qeth_osn_register(unsigned char *read_dev_no,
...
@@ -1241,5 +1241,5 @@ qeth_osn_register(unsigned char *read_dev_no,
extern
void
extern
void
qeth_osn_deregister
(
struct
net_device
*
);
qeth_osn_deregister
(
struct
net_device
*
);
#endif
/* __QETH_H__ */
#endif
/* __QETH_H__ */
drivers/s390/net/qeth_eddp.c
View file @
983f27d3
...
@@ -81,7 +81,7 @@ void
...
@@ -81,7 +81,7 @@ void
qeth_eddp_buf_release_contexts
(
struct
qeth_qdio_out_buffer
*
buf
)
qeth_eddp_buf_release_contexts
(
struct
qeth_qdio_out_buffer
*
buf
)
{
{
struct
qeth_eddp_context_reference
*
ref
;
struct
qeth_eddp_context_reference
*
ref
;
QETH_DBF_TEXT
(
trace
,
6
,
"eddprctx"
);
QETH_DBF_TEXT
(
trace
,
6
,
"eddprctx"
);
while
(
!
list_empty
(
&
buf
->
ctx_list
)){
while
(
!
list_empty
(
&
buf
->
ctx_list
)){
ref
=
list_entry
(
buf
->
ctx_list
.
next
,
ref
=
list_entry
(
buf
->
ctx_list
.
next
,
...
@@ -135,7 +135,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
...
@@ -135,7 +135,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
"buffer!
\n
"
);
"buffer!
\n
"
);
goto
out
;
goto
out
;
}
}
}
}
/* check if the whole next skb fits into current buffer */
/* check if the whole next skb fits into current buffer */
if
((
QETH_MAX_BUFFER_ELEMENTS
(
queue
->
card
)
-
if
((
QETH_MAX_BUFFER_ELEMENTS
(
queue
->
card
)
-
buf
->
next_element_to_fill
)
buf
->
next_element_to_fill
)
...
@@ -148,7 +148,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
...
@@ -148,7 +148,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
* and increment ctx's refcnt */
* and increment ctx's refcnt */
must_refcnt
=
1
;
must_refcnt
=
1
;
continue
;
continue
;
}
}
if
(
must_refcnt
){
if
(
must_refcnt
){
must_refcnt
=
0
;
must_refcnt
=
0
;
if
(
qeth_eddp_buf_ref_context
(
buf
,
ctx
)){
if
(
qeth_eddp_buf_ref_context
(
buf
,
ctx
)){
...
@@ -266,7 +266,7 @@ qeth_eddp_copy_data_tcp(char *dst, struct qeth_eddp_data *eddp, int len,
...
@@ -266,7 +266,7 @@ qeth_eddp_copy_data_tcp(char *dst, struct qeth_eddp_data *eddp, int len,
int
left_in_frag
;
int
left_in_frag
;
int
copy_len
;
int
copy_len
;
u8
*
src
;
u8
*
src
;
QETH_DBF_TEXT
(
trace
,
5
,
"eddpcdtc"
);
QETH_DBF_TEXT
(
trace
,
5
,
"eddpcdtc"
);
if
(
skb_shinfo
(
eddp
->
skb
)
->
nr_frags
==
0
)
{
if
(
skb_shinfo
(
eddp
->
skb
)
->
nr_frags
==
0
)
{
memcpy
(
dst
,
eddp
->
skb
->
data
+
eddp
->
skb_offset
,
len
);
memcpy
(
dst
,
eddp
->
skb
->
data
+
eddp
->
skb_offset
,
len
);
...
@@ -408,7 +408,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
...
@@ -408,7 +408,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
struct
tcphdr
*
tcph
;
struct
tcphdr
*
tcph
;
int
data_len
;
int
data_len
;
u32
hcsum
;
u32
hcsum
;
QETH_DBF_TEXT
(
trace
,
5
,
"eddpftcp"
);
QETH_DBF_TEXT
(
trace
,
5
,
"eddpftcp"
);
eddp
->
skb_offset
=
sizeof
(
struct
qeth_hdr
)
+
eddp
->
nhl
+
eddp
->
thl
;
eddp
->
skb_offset
=
sizeof
(
struct
qeth_hdr
)
+
eddp
->
nhl
+
eddp
->
thl
;
if
(
eddp
->
qh
.
hdr
.
l2
.
id
==
QETH_HEADER_TYPE_LAYER2
)
{
if
(
eddp
->
qh
.
hdr
.
l2
.
id
==
QETH_HEADER_TYPE_LAYER2
)
{
...
@@ -465,13 +465,13 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
...
@@ -465,13 +465,13 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
eddp
->
th
.
tcp
.
h
.
seq
+=
data_len
;
eddp
->
th
.
tcp
.
h
.
seq
+=
data_len
;
}
}
}
}
static
inline
int
static
inline
int
qeth_eddp_fill_context_tcp
(
struct
qeth_eddp_context
*
ctx
,
qeth_eddp_fill_context_tcp
(
struct
qeth_eddp_context
*
ctx
,
struct
sk_buff
*
skb
,
struct
qeth_hdr
*
qhdr
)
struct
sk_buff
*
skb
,
struct
qeth_hdr
*
qhdr
)
{
{
struct
qeth_eddp_data
*
eddp
=
NULL
;
struct
qeth_eddp_data
*
eddp
=
NULL
;
QETH_DBF_TEXT
(
trace
,
5
,
"eddpficx"
);
QETH_DBF_TEXT
(
trace
,
5
,
"eddpficx"
);
/* create our segmentation headers and copy original headers */
/* create our segmentation headers and copy original headers */
if
(
skb
->
protocol
==
ETH_P_IP
)
if
(
skb
->
protocol
==
ETH_P_IP
)
...
@@ -512,7 +512,7 @@ qeth_eddp_calc_num_pages(struct qeth_eddp_context *ctx, struct sk_buff *skb,
...
@@ -512,7 +512,7 @@ qeth_eddp_calc_num_pages(struct qeth_eddp_context *ctx, struct sk_buff *skb,
int
hdr_len
)
int
hdr_len
)
{
{
int
skbs_per_page
;
int
skbs_per_page
;
QETH_DBF_TEXT
(
trace
,
5
,
"eddpcanp"
);
QETH_DBF_TEXT
(
trace
,
5
,
"eddpcanp"
);
/* can we put multiple skbs in one page? */
/* can we put multiple skbs in one page? */
skbs_per_page
=
PAGE_SIZE
/
(
skb_shinfo
(
skb
)
->
tso_size
+
hdr_len
);
skbs_per_page
=
PAGE_SIZE
/
(
skb_shinfo
(
skb
)
->
tso_size
+
hdr_len
);
...
@@ -588,7 +588,7 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,
...
@@ -588,7 +588,7 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,
struct
qeth_hdr
*
qhdr
)
struct
qeth_hdr
*
qhdr
)
{
{
struct
qeth_eddp_context
*
ctx
=
NULL
;
struct
qeth_eddp_context
*
ctx
=
NULL
;
QETH_DBF_TEXT
(
trace
,
5
,
"creddpct"
);
QETH_DBF_TEXT
(
trace
,
5
,
"creddpct"
);
if
(
skb
->
protocol
==
ETH_P_IP
)
if
(
skb
->
protocol
==
ETH_P_IP
)
ctx
=
qeth_eddp_create_context_generic
(
card
,
skb
,
ctx
=
qeth_eddp_create_context_generic
(
card
,
skb
,
...
...
drivers/s390/net/qeth_fs.h
View file @
983f27d3
...
@@ -42,7 +42,7 @@ qeth_create_device_attributes_osn(struct device *dev);
...
@@ -42,7 +42,7 @@ qeth_create_device_attributes_osn(struct device *dev);
extern
void
extern
void
qeth_remove_device_attributes_osn
(
struct
device
*
dev
);
qeth_remove_device_attributes_osn
(
struct
device
*
dev
);
extern
int
extern
int
qeth_create_driver_attributes
(
void
);
qeth_create_driver_attributes
(
void
);
...
...
drivers/s390/net/qeth_main.c
View file @
983f27d3
...
@@ -513,7 +513,7 @@ __qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode)
...
@@ -513,7 +513,7 @@ __qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode)
QETH_DBF_TEXT
(
setup
,
3
,
"setoffl"
);
QETH_DBF_TEXT
(
setup
,
3
,
"setoffl"
);
QETH_DBF_HEX
(
setup
,
3
,
&
card
,
sizeof
(
void
*
));
QETH_DBF_HEX
(
setup
,
3
,
&
card
,
sizeof
(
void
*
));
if
(
card
->
dev
&&
netif_carrier_ok
(
card
->
dev
))
if
(
card
->
dev
&&
netif_carrier_ok
(
card
->
dev
))
netif_carrier_off
(
card
->
dev
);
netif_carrier_off
(
card
->
dev
);
recover_flag
=
card
->
state
;
recover_flag
=
card
->
state
;
...
@@ -604,13 +604,13 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
...
@@ -604,13 +604,13 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
list_for_each_entry
(
addr
,
&
card
->
ip_list
,
entry
)
{
list_for_each_entry
(
addr
,
&
card
->
ip_list
,
entry
)
{
if
(
card
->
options
.
layer2
)
{
if
(
card
->
options
.
layer2
)
{
if
((
addr
->
type
==
todo
->
type
)
&&
if
((
addr
->
type
==
todo
->
type
)
&&
(
memcmp
(
&
addr
->
mac
,
&
todo
->
mac
,
(
memcmp
(
&
addr
->
mac
,
&
todo
->
mac
,
OSA_ADDR_LEN
)
==
0
))
{
OSA_ADDR_LEN
)
==
0
))
{
found
=
1
;
found
=
1
;
break
;
break
;
}
}
continue
;
continue
;
}
}
if
((
addr
->
proto
==
QETH_PROT_IPV4
)
&&
if
((
addr
->
proto
==
QETH_PROT_IPV4
)
&&
(
todo
->
proto
==
QETH_PROT_IPV4
)
&&
(
todo
->
proto
==
QETH_PROT_IPV4
)
&&
(
addr
->
type
==
todo
->
type
)
&&
(
addr
->
type
==
todo
->
type
)
&&
...
@@ -694,13 +694,13 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
...
@@ -694,13 +694,13 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
if
(
card
->
options
.
layer2
)
{
if
(
card
->
options
.
layer2
)
{
if
((
tmp
->
type
==
addr
->
type
)
&&
if
((
tmp
->
type
==
addr
->
type
)
&&
(
tmp
->
is_multicast
==
addr
->
is_multicast
)
&&
(
tmp
->
is_multicast
==
addr
->
is_multicast
)
&&
(
memcmp
(
&
tmp
->
mac
,
&
addr
->
mac
,
(
memcmp
(
&
tmp
->
mac
,
&
addr
->
mac
,
OSA_ADDR_LEN
)
==
0
))
{
OSA_ADDR_LEN
)
==
0
))
{
found
=
1
;
found
=
1
;
break
;
break
;
}
}
continue
;
continue
;
}
}
if
((
tmp
->
proto
==
QETH_PROT_IPV4
)
&&
if
((
tmp
->
proto
==
QETH_PROT_IPV4
)
&&
(
addr
->
proto
==
QETH_PROT_IPV4
)
&&
(
addr
->
proto
==
QETH_PROT_IPV4
)
&&
(
tmp
->
type
==
addr
->
type
)
&&
(
tmp
->
type
==
addr
->
type
)
&&
...
@@ -1173,7 +1173,7 @@ qeth_determine_card_type(struct qeth_card *card)
...
@@ -1173,7 +1173,7 @@ qeth_determine_card_type(struct qeth_card *card)
"due to hardware limitations!
\n
"
);
"due to hardware limitations!
\n
"
);
card
->
qdio
.
no_out_queues
=
1
;
card
->
qdio
.
no_out_queues
=
1
;
card
->
qdio
.
default_out_queue
=
0
;
card
->
qdio
.
default_out_queue
=
0
;
}
}
return
0
;
return
0
;
}
}
i
++
;
i
++
;
...
@@ -1198,7 +1198,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
...
@@ -1198,7 +1198,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
return
-
ENODEV
;
return
-
ENODEV
;
QETH_DBF_TEXT_
(
setup
,
2
,
"%s"
,
gdev
->
dev
.
bus_id
);
QETH_DBF_TEXT_
(
setup
,
2
,
"%s"
,
gdev
->
dev
.
bus_id
);
card
=
qeth_alloc_card
();
card
=
qeth_alloc_card
();
if
(
!
card
)
{
if
(
!
card
)
{
put_device
(
dev
);
put_device
(
dev
);
...
@@ -1220,7 +1220,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
...
@@ -1220,7 +1220,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
put_device
(
dev
);
put_device
(
dev
);
qeth_free_card
(
card
);
qeth_free_card
(
card
);
return
rc
;
return
rc
;
}
}
if
((
rc
=
qeth_setup_card
(
card
))){
if
((
rc
=
qeth_setup_card
(
card
))){
QETH_DBF_TEXT_
(
setup
,
2
,
"2err%d"
,
rc
);
QETH_DBF_TEXT_
(
setup
,
2
,
"2err%d"
,
rc
);
put_device
(
dev
);
put_device
(
dev
);
...
@@ -1843,7 +1843,7 @@ struct qeth_cmd_buffer *iob)
...
@@ -1843,7 +1843,7 @@ struct qeth_cmd_buffer *iob)
&
card
->
seqno
.
pdu_hdr_ack
,
QETH_SEQ_NO_LENGTH
);
&
card
->
seqno
.
pdu_hdr_ack
,
QETH_SEQ_NO_LENGTH
);
QETH_DBF_HEX
(
control
,
2
,
iob
->
data
,
QETH_DBF_CONTROL_LEN
);
QETH_DBF_HEX
(
control
,
2
,
iob
->
data
,
QETH_DBF_CONTROL_LEN
);
}
}
static
int
static
int
qeth_send_control_data
(
struct
qeth_card
*
card
,
int
len
,
qeth_send_control_data
(
struct
qeth_card
*
card
,
int
len
,
struct
qeth_cmd_buffer
*
iob
,
struct
qeth_cmd_buffer
*
iob
,
...
@@ -1937,7 +1937,7 @@ qeth_osn_send_control_data(struct qeth_card *card, int len,
...
@@ -1937,7 +1937,7 @@ qeth_osn_send_control_data(struct qeth_card *card, int len,
wake_up
(
&
card
->
wait_q
);
wake_up
(
&
card
->
wait_q
);
}
}
return
rc
;
return
rc
;
}
}
static
inline
void
static
inline
void
qeth_prepare_ipa_cmd
(
struct
qeth_card
*
card
,
struct
qeth_cmd_buffer
*
iob
,
qeth_prepare_ipa_cmd
(
struct
qeth_card
*
card
,
struct
qeth_cmd_buffer
*
iob
,
...
@@ -1966,7 +1966,7 @@ qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
...
@@ -1966,7 +1966,7 @@ qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
memcpy
(
QETH_IPA_PDU_LEN_PDU3
(
iob
->
data
),
&
s2
,
2
);
memcpy
(
QETH_IPA_PDU_LEN_PDU3
(
iob
->
data
),
&
s2
,
2
);
return
qeth_osn_send_control_data
(
card
,
s1
,
iob
);
return
qeth_osn_send_control_data
(
card
,
s1
,
iob
);
}
}
static
int
static
int
qeth_send_ipa_cmd
(
struct
qeth_card
*
card
,
struct
qeth_cmd_buffer
*
iob
,
qeth_send_ipa_cmd
(
struct
qeth_card
*
card
,
struct
qeth_cmd_buffer
*
iob
,
int
(
*
reply_cb
)
int
(
*
reply_cb
)
...
@@ -2579,7 +2579,7 @@ qeth_process_inbound_buffer(struct qeth_card *card,
...
@@ -2579,7 +2579,7 @@ qeth_process_inbound_buffer(struct qeth_card *card,
skb
->
dev
=
card
->
dev
;
skb
->
dev
=
card
->
dev
;
if
(
hdr
->
hdr
.
l2
.
id
==
QETH_HEADER_TYPE_LAYER2
)
if
(
hdr
->
hdr
.
l2
.
id
==
QETH_HEADER_TYPE_LAYER2
)
vlan_tag
=
qeth_layer2_rebuild_skb
(
card
,
skb
,
hdr
);
vlan_tag
=
qeth_layer2_rebuild_skb
(
card
,
skb
,
hdr
);
else
if
(
hdr
->
hdr
.
l3
.
id
==
QETH_HEADER_TYPE_LAYER3
)
else
if
(
hdr
->
hdr
.
l3
.
id
==
QETH_HEADER_TYPE_LAYER3
)
qeth_rebuild_skb
(
card
,
skb
,
hdr
);
qeth_rebuild_skb
(
card
,
skb
,
hdr
);
else
{
/*in case of OSN*/
else
{
/*in case of OSN*/
skb_push
(
skb
,
sizeof
(
struct
qeth_hdr
));
skb_push
(
skb
,
sizeof
(
struct
qeth_hdr
));
...
@@ -2763,7 +2763,7 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
...
@@ -2763,7 +2763,7 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
index
=
i
%
QDIO_MAX_BUFFERS_PER_Q
;
index
=
i
%
QDIO_MAX_BUFFERS_PER_Q
;
buffer
=
&
card
->
qdio
.
in_q
->
bufs
[
index
];
buffer
=
&
card
->
qdio
.
in_q
->
bufs
[
index
];
if
(
!
((
status
&
QDIO_STATUS_LOOK_FOR_ERROR
)
&&
if
(
!
((
status
&
QDIO_STATUS_LOOK_FOR_ERROR
)
&&
qeth_check_qdio_errors
(
buffer
->
buffer
,
qeth_check_qdio_errors
(
buffer
->
buffer
,
qdio_err
,
siga_err
,
"qinerr"
)))
qdio_err
,
siga_err
,
"qinerr"
)))
qeth_process_inbound_buffer
(
card
,
buffer
,
index
);
qeth_process_inbound_buffer
(
card
,
buffer
,
index
);
/* clear buffer and give back to hardware */
/* clear buffer and give back to hardware */
...
@@ -3187,7 +3187,7 @@ qeth_alloc_qdio_buffers(struct qeth_card *card)
...
@@ -3187,7 +3187,7 @@ qeth_alloc_qdio_buffers(struct qeth_card *card)
if
(
card
->
qdio
.
state
==
QETH_QDIO_ALLOCATED
)
if
(
card
->
qdio
.
state
==
QETH_QDIO_ALLOCATED
)
return
0
;
return
0
;
card
->
qdio
.
in_q
=
kmalloc
(
sizeof
(
struct
qeth_qdio_q
),
card
->
qdio
.
in_q
=
kmalloc
(
sizeof
(
struct
qeth_qdio_q
),
GFP_KERNEL
|
GFP_DMA
);
GFP_KERNEL
|
GFP_DMA
);
if
(
!
card
->
qdio
.
in_q
)
if
(
!
card
->
qdio
.
in_q
)
return
-
ENOMEM
;
return
-
ENOMEM
;
...
@@ -3476,7 +3476,7 @@ qeth_halt_channels(struct qeth_card *card)
...
@@ -3476,7 +3476,7 @@ qeth_halt_channels(struct qeth_card *card)
rc3
=
qeth_halt_channel
(
&
card
->
data
);
rc3
=
qeth_halt_channel
(
&
card
->
data
);
if
(
rc1
)
if
(
rc1
)
return
rc1
;
return
rc1
;
if
(
rc2
)
if
(
rc2
)
return
rc2
;
return
rc2
;
return
rc3
;
return
rc3
;
}
}
...
@@ -3491,7 +3491,7 @@ qeth_clear_channels(struct qeth_card *card)
...
@@ -3491,7 +3491,7 @@ qeth_clear_channels(struct qeth_card *card)
rc3
=
qeth_clear_channel
(
&
card
->
data
);
rc3
=
qeth_clear_channel
(
&
card
->
data
);
if
(
rc1
)
if
(
rc1
)
return
rc1
;
return
rc1
;
if
(
rc2
)
if
(
rc2
)
return
rc2
;
return
rc2
;
return
rc3
;
return
rc3
;
}
}
...
@@ -3798,10 +3798,10 @@ qeth_open(struct net_device *dev)
...
@@ -3798,10 +3798,10 @@ qeth_open(struct net_device *dev)
QETH_DBF_TEXT
(
trace
,
4
,
"nomacadr"
);
QETH_DBF_TEXT
(
trace
,
4
,
"nomacadr"
);
return
-
EPERM
;
return
-
EPERM
;
}
}
card
->
dev
->
flags
|=
IFF_UP
;
netif_start_queue
(
dev
);
card
->
data
.
state
=
CH_STATE_UP
;
card
->
data
.
state
=
CH_STATE_UP
;
card
->
state
=
CARD_STATE_UP
;
card
->
state
=
CARD_STATE_UP
;
card
->
dev
->
flags
|=
IFF_UP
;
netif_start_queue
(
dev
);
if
(
!
card
->
lan_online
&&
netif_carrier_ok
(
dev
))
if
(
!
card
->
lan_online
&&
netif_carrier_ok
(
dev
))
netif_carrier_off
(
dev
);
netif_carrier_off
(
dev
);
...
@@ -3817,7 +3817,7 @@ qeth_stop(struct net_device *dev)
...
@@ -3817,7 +3817,7 @@ qeth_stop(struct net_device *dev)
card
=
(
struct
qeth_card
*
)
dev
->
priv
;
card
=
(
struct
qeth_card
*
)
dev
->
priv
;
netif_
stop_queu
e
(
dev
);
netif_
tx_disabl
e
(
dev
);
card
->
dev
->
flags
&=
~
IFF_UP
;
card
->
dev
->
flags
&=
~
IFF_UP
;
if
(
card
->
state
==
CARD_STATE_UP
)
if
(
card
->
state
==
CARD_STATE_UP
)
card
->
state
=
CARD_STATE_SOFTSETUP
;
card
->
state
=
CARD_STATE_SOFTSETUP
;
...
@@ -3958,7 +3958,7 @@ qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
...
@@ -3958,7 +3958,7 @@ qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
#endif
#endif
*
hdr
=
(
struct
qeth_hdr
*
)
*
hdr
=
(
struct
qeth_hdr
*
)
qeth_push_skb
(
card
,
skb
,
sizeof
(
struct
qeth_hdr
));
qeth_push_skb
(
card
,
skb
,
sizeof
(
struct
qeth_hdr
));
if
(
hdr
==
NULL
)
if
(
*
hdr
==
NULL
)
return
-
EINVAL
;
return
-
EINVAL
;
return
0
;
return
0
;
}
}
...
@@ -4098,7 +4098,7 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
...
@@ -4098,7 +4098,7 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
}
}
}
else
{
/* passthrough */
}
else
{
/* passthrough */
if
((
skb
->
dev
->
type
==
ARPHRD_IEEE802_TR
)
&&
if
((
skb
->
dev
->
type
==
ARPHRD_IEEE802_TR
)
&&
!
memcmp
(
skb
->
data
+
sizeof
(
struct
qeth_hdr
)
+
!
memcmp
(
skb
->
data
+
sizeof
(
struct
qeth_hdr
)
+
sizeof
(
__u16
),
skb
->
dev
->
broadcast
,
6
))
{
sizeof
(
__u16
),
skb
->
dev
->
broadcast
,
6
))
{
hdr
->
hdr
.
l3
.
flags
=
QETH_CAST_BROADCAST
|
hdr
->
hdr
.
l3
.
flags
=
QETH_CAST_BROADCAST
|
QETH_HDR_PASSTHRU
;
QETH_HDR_PASSTHRU
;
...
@@ -4385,7 +4385,7 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
...
@@ -4385,7 +4385,7 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
}
}
static
inline
int
static
inline
int
qeth_get_elements_no
(
struct
qeth_card
*
card
,
void
*
hdr
,
qeth_get_elements_no
(
struct
qeth_card
*
card
,
void
*
hdr
,
struct
sk_buff
*
skb
,
int
elems
)
struct
sk_buff
*
skb
,
int
elems
)
{
{
int
elements_needed
=
0
;
int
elements_needed
=
0
;
...
@@ -4416,6 +4416,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
...
@@ -4416,6 +4416,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
enum
qeth_large_send_types
large_send
=
QETH_LARGE_SEND_NO
;
enum
qeth_large_send_types
large_send
=
QETH_LARGE_SEND_NO
;
struct
qeth_eddp_context
*
ctx
=
NULL
;
struct
qeth_eddp_context
*
ctx
=
NULL
;
int
tx_bytes
=
skb
->
len
;
int
tx_bytes
=
skb
->
len
;
unsigned
short
nr_frags
=
skb_shinfo
(
skb
)
->
nr_frags
;
unsigned
short
tso_size
=
skb_shinfo
(
skb
)
->
tso_size
;
int
rc
;
int
rc
;
QETH_DBF_TEXT
(
trace
,
6
,
"sendpkt"
);
QETH_DBF_TEXT
(
trace
,
6
,
"sendpkt"
);
...
@@ -4441,7 +4443,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
...
@@ -4441,7 +4443,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
return
0
;
return
0
;
}
}
cast_type
=
qeth_get_cast_type
(
card
,
skb
);
cast_type
=
qeth_get_cast_type
(
card
,
skb
);
if
((
cast_type
==
RTN_BROADCAST
)
&&
if
((
cast_type
==
RTN_BROADCAST
)
&&
(
card
->
info
.
broadcast_capable
==
0
)){
(
card
->
info
.
broadcast_capable
==
0
)){
card
->
stats
.
tx_dropped
++
;
card
->
stats
.
tx_dropped
++
;
card
->
stats
.
tx_errors
++
;
card
->
stats
.
tx_errors
++
;
...
@@ -4463,7 +4465,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
...
@@ -4463,7 +4465,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
card
->
stats
.
tx_errors
++
;
card
->
stats
.
tx_errors
++
;
dev_kfree_skb_any
(
skb
);
dev_kfree_skb_any
(
skb
);
return
NETDEV_TX_OK
;
return
NETDEV_TX_OK
;
}
}
elements_needed
++
;
elements_needed
++
;
}
else
{
}
else
{
if
((
rc
=
qeth_prepare_skb
(
card
,
&
skb
,
&
hdr
,
ipv
)))
{
if
((
rc
=
qeth_prepare_skb
(
card
,
&
skb
,
&
hdr
,
ipv
)))
{
...
@@ -4498,16 +4500,16 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
...
@@ -4498,16 +4500,16 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
card
->
stats
.
tx_packets
++
;
card
->
stats
.
tx_packets
++
;
card
->
stats
.
tx_bytes
+=
tx_bytes
;
card
->
stats
.
tx_bytes
+=
tx_bytes
;
#ifdef CONFIG_QETH_PERF_STATS
#ifdef CONFIG_QETH_PERF_STATS
if
(
skb_shinfo
(
skb
)
->
tso_size
&&
if
(
tso_size
&&
!
(
large_send
==
QETH_LARGE_SEND_NO
))
{
!
(
large_send
==
QETH_LARGE_SEND_NO
))
{
card
->
perf_stats
.
large_send_bytes
+=
skb
->
len
;
card
->
perf_stats
.
large_send_bytes
+=
tx_bytes
;
card
->
perf_stats
.
large_send_cnt
++
;
card
->
perf_stats
.
large_send_cnt
++
;
}
}
if
(
skb_shinfo
(
skb
)
->
nr_frags
>
0
){
if
(
nr_frags
>
0
){
card
->
perf_stats
.
sg_skbs_sent
++
;
card
->
perf_stats
.
sg_skbs_sent
++
;
/* nr_frags + skb->data */
/* nr_frags + skb->data */
card
->
perf_stats
.
sg_frags_sent
+=
card
->
perf_stats
.
sg_frags_sent
+=
skb_shinfo
(
skb
)
->
nr_frags
+
1
;
nr_frags
+
1
;
}
}
#endif
/* CONFIG_QETH_PERF_STATS */
#endif
/* CONFIG_QETH_PERF_STATS */
}
}
...
@@ -5373,7 +5375,7 @@ qeth_layer2_send_setdelvlan_cb(struct qeth_card *card,
...
@@ -5373,7 +5375,7 @@ qeth_layer2_send_setdelvlan_cb(struct qeth_card *card,
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
if
(
cmd
->
hdr
.
return_code
)
{
if
(
cmd
->
hdr
.
return_code
)
{
PRINT_ERR
(
"Error in processing VLAN %i on %s: 0x%x. "
PRINT_ERR
(
"Error in processing VLAN %i on %s: 0x%x. "
"Continuing
\n
"
,
cmd
->
data
.
setdelvlan
.
vlan_id
,
"Continuing
\n
"
,
cmd
->
data
.
setdelvlan
.
vlan_id
,
QETH_CARD_IFNAME
(
card
),
cmd
->
hdr
.
return_code
);
QETH_CARD_IFNAME
(
card
),
cmd
->
hdr
.
return_code
);
QETH_DBF_TEXT_
(
trace
,
2
,
"L2VL%4x"
,
cmd
->
hdr
.
command
);
QETH_DBF_TEXT_
(
trace
,
2
,
"L2VL%4x"
,
cmd
->
hdr
.
command
);
QETH_DBF_TEXT_
(
trace
,
2
,
"L2%s"
,
CARD_BUS_ID
(
card
));
QETH_DBF_TEXT_
(
trace
,
2
,
"L2%s"
,
CARD_BUS_ID
(
card
));
...
@@ -5393,7 +5395,7 @@ qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
...
@@ -5393,7 +5395,7 @@ qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
iob
=
qeth_get_ipacmd_buffer
(
card
,
ipacmd
,
QETH_PROT_IPV4
);
iob
=
qeth_get_ipacmd_buffer
(
card
,
ipacmd
,
QETH_PROT_IPV4
);
cmd
=
(
struct
qeth_ipa_cmd
*
)(
iob
->
data
+
IPA_PDU_HEADER_SIZE
);
cmd
=
(
struct
qeth_ipa_cmd
*
)(
iob
->
data
+
IPA_PDU_HEADER_SIZE
);
cmd
->
data
.
setdelvlan
.
vlan_id
=
i
;
cmd
->
data
.
setdelvlan
.
vlan_id
=
i
;
return
qeth_send_ipa_cmd
(
card
,
iob
,
return
qeth_send_ipa_cmd
(
card
,
iob
,
qeth_layer2_send_setdelvlan_cb
,
NULL
);
qeth_layer2_send_setdelvlan_cb
,
NULL
);
}
}
...
@@ -5457,7 +5459,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
...
@@ -5457,7 +5459,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
* Examine hardware response to SET_PROMISC_MODE
* Examine hardware response to SET_PROMISC_MODE
*/
*/
static
int
static
int
qeth_setadp_promisc_mode_cb
(
struct
qeth_card
*
card
,
qeth_setadp_promisc_mode_cb
(
struct
qeth_card
*
card
,
struct
qeth_reply
*
reply
,
struct
qeth_reply
*
reply
,
unsigned
long
data
)
unsigned
long
data
)
{
{
...
@@ -5468,10 +5470,10 @@ qeth_setadp_promisc_mode_cb(struct qeth_card *card,
...
@@ -5468,10 +5470,10 @@ qeth_setadp_promisc_mode_cb(struct qeth_card *card,
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
setparms
=
&
(
cmd
->
data
.
setadapterparms
);
setparms
=
&
(
cmd
->
data
.
setadapterparms
);
qeth_default_setadapterparms_cb
(
card
,
reply
,
(
unsigned
long
)
cmd
);
qeth_default_setadapterparms_cb
(
card
,
reply
,
(
unsigned
long
)
cmd
);
if
(
cmd
->
hdr
.
return_code
)
{
if
(
cmd
->
hdr
.
return_code
)
{
QETH_DBF_TEXT_
(
trace
,
4
,
"prmrc%2.2x"
,
cmd
->
hdr
.
return_code
);
QETH_DBF_TEXT_
(
trace
,
4
,
"prmrc%2.2x"
,
cmd
->
hdr
.
return_code
);
setparms
->
data
.
mode
=
SET_PROMISC_MODE_OFF
;
setparms
->
data
.
mode
=
SET_PROMISC_MODE_OFF
;
}
}
card
->
info
.
promisc_mode
=
setparms
->
data
.
mode
;
card
->
info
.
promisc_mode
=
setparms
->
data
.
mode
;
...
@@ -5517,7 +5519,7 @@ qeth_set_multicast_list(struct net_device *dev)
...
@@ -5517,7 +5519,7 @@ qeth_set_multicast_list(struct net_device *dev)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
return
;
return
;
QETH_DBF_TEXT
(
trace
,
3
,
"setmulti"
);
QETH_DBF_TEXT
(
trace
,
3
,
"setmulti"
);
qeth_delete_mc_addresses
(
card
);
qeth_delete_mc_addresses
(
card
);
if
(
card
->
options
.
layer2
)
{
if
(
card
->
options
.
layer2
)
{
...
@@ -5575,7 +5577,7 @@ qeth_osn_assist(struct net_device *dev,
...
@@ -5575,7 +5577,7 @@ qeth_osn_assist(struct net_device *dev,
struct
qeth_cmd_buffer
*
iob
;
struct
qeth_cmd_buffer
*
iob
;
struct
qeth_card
*
card
;
struct
qeth_card
*
card
;
int
rc
;
int
rc
;
QETH_DBF_TEXT
(
trace
,
2
,
"osnsdmc"
);
QETH_DBF_TEXT
(
trace
,
2
,
"osnsdmc"
);
if
(
!
dev
)
if
(
!
dev
)
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -5654,7 +5656,7 @@ qeth_osn_deregister(struct net_device * dev)
...
@@ -5654,7 +5656,7 @@ qeth_osn_deregister(struct net_device * dev)
card
->
osn_info
.
data_cb
=
NULL
;
card
->
osn_info
.
data_cb
=
NULL
;
return
;
return
;
}
}
static
void
static
void
qeth_delete_mc_addresses
(
struct
qeth_card
*
card
)
qeth_delete_mc_addresses
(
struct
qeth_card
*
card
)
{
{
...
@@ -5818,7 +5820,7 @@ qeth_add_multicast_ipv6(struct qeth_card *card)
...
@@ -5818,7 +5820,7 @@ qeth_add_multicast_ipv6(struct qeth_card *card)
struct
inet6_dev
*
in6_dev
;
struct
inet6_dev
*
in6_dev
;
QETH_DBF_TEXT
(
trace
,
4
,
"chkmcv6"
);
QETH_DBF_TEXT
(
trace
,
4
,
"chkmcv6"
);
if
(
!
qeth_is_supported
(
card
,
IPA_IPV6
))
if
(
!
qeth_is_supported
(
card
,
IPA_IPV6
))
return
;
return
;
in6_dev
=
in6_dev_get
(
card
->
dev
);
in6_dev
=
in6_dev_get
(
card
->
dev
);
if
(
in6_dev
==
NULL
)
if
(
in6_dev
==
NULL
)
...
@@ -6359,12 +6361,9 @@ qeth_netdev_init(struct net_device *dev)
...
@@ -6359,12 +6361,9 @@ qeth_netdev_init(struct net_device *dev)
dev
->
vlan_rx_kill_vid
=
qeth_vlan_rx_kill_vid
;
dev
->
vlan_rx_kill_vid
=
qeth_vlan_rx_kill_vid
;
dev
->
vlan_rx_add_vid
=
qeth_vlan_rx_add_vid
;
dev
->
vlan_rx_add_vid
=
qeth_vlan_rx_add_vid
;
#endif
#endif
dev
->
hard_header
=
card
->
orig_hard_header
;
if
(
qeth_get_netdev_flags
(
card
)
&
IFF_NOARP
)
{
if
(
qeth_get_netdev_flags
(
card
)
&
IFF_NOARP
)
{
dev
->
rebuild_header
=
NULL
;
dev
->
rebuild_header
=
NULL
;
dev
->
hard_header
=
NULL
;
dev
->
hard_header
=
NULL
;
if
(
card
->
options
.
fake_ll
)
dev
->
hard_header
=
qeth_fake_header
;
dev
->
header_cache_update
=
NULL
;
dev
->
header_cache_update
=
NULL
;
dev
->
hard_header_cache
=
NULL
;
dev
->
hard_header_cache
=
NULL
;
}
}
...
@@ -6373,6 +6372,9 @@ qeth_netdev_init(struct net_device *dev)
...
@@ -6373,6 +6372,9 @@ qeth_netdev_init(struct net_device *dev)
if
(
!
(
card
->
info
.
unique_id
&
UNIQUE_ID_NOT_BY_CARD
))
if
(
!
(
card
->
info
.
unique_id
&
UNIQUE_ID_NOT_BY_CARD
))
card
->
dev
->
dev_id
=
card
->
info
.
unique_id
&
0xffff
;
card
->
dev
->
dev_id
=
card
->
info
.
unique_id
&
0xffff
;
#endif
#endif
if
(
card
->
options
.
fake_ll
&&
(
qeth_get_netdev_flags
(
card
)
&
IFF_NOARP
))
dev
->
hard_header
=
qeth_fake_header
;
dev
->
hard_header_parse
=
NULL
;
dev
->
hard_header_parse
=
NULL
;
dev
->
set_mac_address
=
qeth_layer2_set_mac_address
;
dev
->
set_mac_address
=
qeth_layer2_set_mac_address
;
dev
->
flags
|=
qeth_get_netdev_flags
(
card
);
dev
->
flags
|=
qeth_get_netdev_flags
(
card
);
...
@@ -6477,6 +6479,9 @@ qeth_hardsetup_card(struct qeth_card *card)
...
@@ -6477,6 +6479,9 @@ qeth_hardsetup_card(struct qeth_card *card)
/*network device will be recovered*/
/*network device will be recovered*/
if
(
card
->
dev
)
{
if
(
card
->
dev
)
{
card
->
dev
->
hard_header
=
card
->
orig_hard_header
;
card
->
dev
->
hard_header
=
card
->
orig_hard_header
;
if
(
card
->
options
.
fake_ll
&&
(
qeth_get_netdev_flags
(
card
)
&
IFF_NOARP
))
card
->
dev
->
hard_header
=
qeth_fake_header
;
return
0
;
return
0
;
}
}
/* at first set_online allocate netdev */
/* at first set_online allocate netdev */
...
@@ -6584,7 +6589,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
...
@@ -6584,7 +6589,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
if
(
!
card
->
options
.
layer2
||
card
->
info
.
guestlan
||
if
(
!
card
->
options
.
layer2
||
card
->
info
.
guestlan
||
!
(
card
->
info
.
mac_bits
&
QETH_LAYER2_MAC_READ
))
{
!
(
card
->
info
.
mac_bits
&
QETH_LAYER2_MAC_READ
))
{
memcpy
(
card
->
dev
->
dev_addr
,
memcpy
(
card
->
dev
->
dev_addr
,
&
cmd
->
data
.
setadapterparms
.
data
.
change_addr
.
addr
,
&
cmd
->
data
.
setadapterparms
.
data
.
change_addr
.
addr
,
OSA_ADDR_LEN
);
OSA_ADDR_LEN
);
...
@@ -7031,14 +7036,12 @@ qeth_softsetup_ipv6(struct qeth_card *card)
...
@@ -7031,14 +7036,12 @@ qeth_softsetup_ipv6(struct qeth_card *card)
QETH_DBF_TEXT
(
trace
,
3
,
"softipv6"
);
QETH_DBF_TEXT
(
trace
,
3
,
"softipv6"
);
netif_stop_queue
(
card
->
dev
);
rc
=
qeth_send_startlan
(
card
,
QETH_PROT_IPV6
);
rc
=
qeth_send_startlan
(
card
,
QETH_PROT_IPV6
);
if
(
rc
)
{
if
(
rc
)
{
PRINT_ERR
(
"IPv6 startlan failed on %s
\n
"
,
PRINT_ERR
(
"IPv6 startlan failed on %s
\n
"
,
QETH_CARD_IFNAME
(
card
));
QETH_CARD_IFNAME
(
card
));
return
rc
;
return
rc
;
}
}
netif_wake_queue
(
card
->
dev
);
rc
=
qeth_query_ipassists
(
card
,
QETH_PROT_IPV6
);
rc
=
qeth_query_ipassists
(
card
,
QETH_PROT_IPV6
);
if
(
rc
)
{
if
(
rc
)
{
PRINT_ERR
(
"IPv6 query ipassist failed on %s
\n
"
,
PRINT_ERR
(
"IPv6 query ipassist failed on %s
\n
"
,
...
@@ -7352,7 +7355,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
...
@@ -7352,7 +7355,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
card
->
options
.
large_send
=
type
;
card
->
options
.
large_send
=
type
;
return
0
;
return
0
;
}
}
netif_stop_queue
(
card
->
dev
);
if
(
card
->
state
==
CARD_STATE_UP
)
netif_tx_disable
(
card
->
dev
);
card
->
options
.
large_send
=
type
;
card
->
options
.
large_send
=
type
;
switch
(
card
->
options
.
large_send
)
{
switch
(
card
->
options
.
large_send
)
{
case
QETH_LARGE_SEND_EDDP
:
case
QETH_LARGE_SEND_EDDP
:
...
@@ -7374,7 +7378,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
...
@@ -7374,7 +7378,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
card
->
dev
->
features
&=
~
(
NETIF_F_TSO
|
NETIF_F_SG
);
card
->
dev
->
features
&=
~
(
NETIF_F_TSO
|
NETIF_F_SG
);
break
;
break
;
}
}
netif_wake_queue
(
card
->
dev
);
if
(
card
->
state
==
CARD_STATE_UP
)
netif_wake_queue
(
card
->
dev
);
return
rc
;
return
rc
;
}
}
...
@@ -7427,7 +7432,7 @@ qeth_softsetup_card(struct qeth_card *card)
...
@@ -7427,7 +7432,7 @@ qeth_softsetup_card(struct qeth_card *card)
if
((
rc
=
qeth_setrouting_v6
(
card
)))
if
((
rc
=
qeth_setrouting_v6
(
card
)))
QETH_DBF_TEXT_
(
setup
,
2
,
"5err%d"
,
rc
);
QETH_DBF_TEXT_
(
setup
,
2
,
"5err%d"
,
rc
);
out:
out:
netif_
stop_queu
e
(
card
->
dev
);
netif_
tx_disabl
e
(
card
->
dev
);
return
0
;
return
0
;
}
}
...
@@ -7567,7 +7572,7 @@ qeth_stop_card(struct qeth_card *card, int recovery_mode)
...
@@ -7567,7 +7572,7 @@ qeth_stop_card(struct qeth_card *card, int recovery_mode)
if
(
card
->
read
.
state
==
CH_STATE_UP
&&
if
(
card
->
read
.
state
==
CH_STATE_UP
&&
card
->
write
.
state
==
CH_STATE_UP
&&
card
->
write
.
state
==
CH_STATE_UP
&&
(
card
->
state
==
CARD_STATE_UP
))
{
(
card
->
state
==
CARD_STATE_UP
))
{
if
(
recovery_mode
&&
if
(
recovery_mode
&&
card
->
info
.
type
!=
QETH_CARD_TYPE_OSN
)
{
card
->
info
.
type
!=
QETH_CARD_TYPE_OSN
)
{
qeth_stop
(
card
->
dev
);
qeth_stop
(
card
->
dev
);
}
else
{
}
else
{
...
@@ -7736,10 +7741,8 @@ static int
...
@@ -7736,10 +7741,8 @@ static int
qeth_register_netdev
(
struct
qeth_card
*
card
)
qeth_register_netdev
(
struct
qeth_card
*
card
)
{
{
QETH_DBF_TEXT
(
setup
,
3
,
"regnetd"
);
QETH_DBF_TEXT
(
setup
,
3
,
"regnetd"
);
if
(
card
->
dev
->
reg_state
!=
NETREG_UNINITIALIZED
)
{
if
(
card
->
dev
->
reg_state
!=
NETREG_UNINITIALIZED
)
qeth_netdev_init
(
card
->
dev
);
return
0
;
return
0
;
}
/* sysfs magic */
/* sysfs magic */
SET_NETDEV_DEV
(
card
->
dev
,
&
card
->
gdev
->
dev
);
SET_NETDEV_DEV
(
card
->
dev
,
&
card
->
gdev
->
dev
);
return
register_netdev
(
card
->
dev
);
return
register_netdev
(
card
->
dev
);
...
@@ -7750,7 +7753,7 @@ qeth_start_again(struct qeth_card *card, int recovery_mode)
...
@@ -7750,7 +7753,7 @@ qeth_start_again(struct qeth_card *card, int recovery_mode)
{
{
QETH_DBF_TEXT
(
setup
,
2
,
"startag"
);
QETH_DBF_TEXT
(
setup
,
2
,
"startag"
);
if
(
recovery_mode
&&
if
(
recovery_mode
&&
card
->
info
.
type
!=
QETH_CARD_TYPE_OSN
)
{
card
->
info
.
type
!=
QETH_CARD_TYPE_OSN
)
{
qeth_open
(
card
->
dev
);
qeth_open
(
card
->
dev
);
}
else
{
}
else
{
...
...
drivers/s390/net/qeth_mpc.h
View file @
983f27d3
...
@@ -445,7 +445,7 @@ enum qeth_ipa_arp_return_codes {
...
@@ -445,7 +445,7 @@ enum qeth_ipa_arp_return_codes {
/* Helper functions */
/* Helper functions */
#define IS_IPA_REPLY(cmd) ((cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST) || \
#define IS_IPA_REPLY(cmd) ((cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST) || \
(cmd->hdr.initiator == IPA_CMD_INITIATOR_OSA_REPLY))
(cmd->hdr.initiator == IPA_CMD_INITIATOR_OSA_REPLY))
/*****************************************************************************/
/*****************************************************************************/
/* END OF IP Assist related definitions */
/* END OF IP Assist related definitions */
/*****************************************************************************/
/*****************************************************************************/
...
@@ -490,7 +490,7 @@ extern unsigned char ULP_ENABLE[];
...
@@ -490,7 +490,7 @@ extern unsigned char ULP_ENABLE[];
/* Layer 2 defintions */
/* Layer 2 defintions */
#define QETH_PROT_LAYER2 0x08
#define QETH_PROT_LAYER2 0x08
#define QETH_PROT_TCPIP 0x03
#define QETH_PROT_TCPIP 0x03
#define QETH_PROT_OSN2 0x0a
#define QETH_PROT_OSN2 0x0a
#define QETH_ULP_ENABLE_PROT_TYPE(buffer) (buffer+0x50)
#define QETH_ULP_ENABLE_PROT_TYPE(buffer) (buffer+0x50)
#define QETH_IPA_CMD_PROT_TYPE(buffer) (buffer+0x19)
#define QETH_IPA_CMD_PROT_TYPE(buffer) (buffer+0x19)
...
...
drivers/s390/net/qeth_proc.c
View file @
983f27d3
...
@@ -36,7 +36,7 @@ qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
...
@@ -36,7 +36,7 @@ qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
{
{
struct
device
*
dev
=
NULL
;
struct
device
*
dev
=
NULL
;
loff_t
nr
=
0
;
loff_t
nr
=
0
;
down_read
(
&
qeth_ccwgroup_driver
.
driver
.
bus
->
subsys
.
rwsem
);
down_read
(
&
qeth_ccwgroup_driver
.
driver
.
bus
->
subsys
.
rwsem
);
if
(
*
offset
==
0
)
if
(
*
offset
==
0
)
return
SEQ_START_TOKEN
;
return
SEQ_START_TOKEN
;
...
@@ -60,8 +60,8 @@ static void *
...
@@ -60,8 +60,8 @@ static void *
qeth_procfile_seq_next
(
struct
seq_file
*
s
,
void
*
it
,
loff_t
*
offset
)
qeth_procfile_seq_next
(
struct
seq_file
*
s
,
void
*
it
,
loff_t
*
offset
)
{
{
struct
device
*
prev
,
*
next
;
struct
device
*
prev
,
*
next
;
if
(
it
==
SEQ_START_TOKEN
)
if
(
it
==
SEQ_START_TOKEN
)
prev
=
NULL
;
prev
=
NULL
;
else
else
prev
=
(
struct
device
*
)
it
;
prev
=
(
struct
device
*
)
it
;
...
@@ -180,7 +180,7 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
...
@@ -180,7 +180,7 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
struct
device
*
device
;
struct
device
*
device
;
struct
qeth_card
*
card
;
struct
qeth_card
*
card
;
if
(
it
==
SEQ_START_TOKEN
)
if
(
it
==
SEQ_START_TOKEN
)
return
0
;
return
0
;
...
...
drivers/s390/net/qeth_sys.c
View file @
983f27d3
...
@@ -785,7 +785,7 @@ qeth_dev_large_send_store(struct device *dev, struct device_attribute *attr, con
...
@@ -785,7 +785,7 @@ qeth_dev_large_send_store(struct device *dev, struct device_attribute *attr, con
}
}
if
(
card
->
options
.
large_send
==
type
)
if
(
card
->
options
.
large_send
==
type
)
return
count
;
return
count
;
if
((
rc
=
qeth_set_large_send
(
card
,
type
)))
if
((
rc
=
qeth_set_large_send
(
card
,
type
)))
return
rc
;
return
rc
;
return
count
;
return
count
;
}
}
...
@@ -1682,7 +1682,7 @@ qeth_create_device_attributes(struct device *dev)
...
@@ -1682,7 +1682,7 @@ qeth_create_device_attributes(struct device *dev)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
return
sysfs_create_group
(
&
dev
->
kobj
,
return
sysfs_create_group
(
&
dev
->
kobj
,
&
qeth_osn_device_attr_group
);
&
qeth_osn_device_attr_group
);
if
((
ret
=
sysfs_create_group
(
&
dev
->
kobj
,
&
qeth_device_attr_group
)))
if
((
ret
=
sysfs_create_group
(
&
dev
->
kobj
,
&
qeth_device_attr_group
)))
return
ret
;
return
ret
;
if
((
ret
=
sysfs_create_group
(
&
dev
->
kobj
,
&
qeth_device_ipato_group
))){
if
((
ret
=
sysfs_create_group
(
&
dev
->
kobj
,
&
qeth_device_ipato_group
))){
...
@@ -1713,7 +1713,7 @@ qeth_remove_device_attributes(struct device *dev)
...
@@ -1713,7 +1713,7 @@ qeth_remove_device_attributes(struct device *dev)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
return
sysfs_remove_group
(
&
dev
->
kobj
,
return
sysfs_remove_group
(
&
dev
->
kobj
,
&
qeth_osn_device_attr_group
);
&
qeth_osn_device_attr_group
);
sysfs_remove_group
(
&
dev
->
kobj
,
&
qeth_device_attr_group
);
sysfs_remove_group
(
&
dev
->
kobj
,
&
qeth_device_attr_group
);
sysfs_remove_group
(
&
dev
->
kobj
,
&
qeth_device_ipato_group
);
sysfs_remove_group
(
&
dev
->
kobj
,
&
qeth_device_ipato_group
);
sysfs_remove_group
(
&
dev
->
kobj
,
&
qeth_device_vipa_group
);
sysfs_remove_group
(
&
dev
->
kobj
,
&
qeth_device_vipa_group
);
...
...
drivers/s390/net/qeth_tso.h
View file @
983f27d3
...
@@ -117,11 +117,11 @@ __qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer,
...
@@ -117,11 +117,11 @@ __qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer,
int
fragno
;
int
fragno
;
unsigned
long
addr
;
unsigned
long
addr
;
int
element
,
cnt
,
dlen
;
int
element
,
cnt
,
dlen
;
fragno
=
skb_shinfo
(
skb
)
->
nr_frags
;
fragno
=
skb_shinfo
(
skb
)
->
nr_frags
;
element
=
*
next_element_to_fill
;
element
=
*
next_element_to_fill
;
dlen
=
0
;
dlen
=
0
;
if
(
is_tso
)
if
(
is_tso
)
buffer
->
element
[
element
].
flags
=
buffer
->
element
[
element
].
flags
=
SBAL_FLAGS_MIDDLE_FRAG
;
SBAL_FLAGS_MIDDLE_FRAG
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment