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)
}
}
static
void
static
void
ch_action_reinit
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
{
struct
channel
*
ch
=
(
struct
channel
*
)
arg
;
struct
net_device
*
dev
=
ch
->
netdev
;
struct
ctc_priv
*
privptr
=
dev
->
priv
;
DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
ch_action_iofatal
(
fi
,
event
,
arg
);
fsm_addtimer
(
&
privptr
->
restart_timer
,
1000
,
DEV_EVENT_RESTART
,
dev
);
...
...
@@ -1619,7 +1619,7 @@ less_than(char *id1, char *id2)
}
dev1
=
simple_strtoul
(
id1
,
&
id1
,
16
);
dev2
=
simple_strtoul
(
id2
,
&
id2
,
16
);
return
(
dev1
<
dev2
);
}
...
...
@@ -1890,7 +1890,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
irb
->
scsw
.
dstat
);
return
;
}
priv
=
((
struct
ccwgroup_device
*
)
cdev
->
dev
.
driver_data
)
->
dev
.
driver_data
;
...
...
@@ -1904,7 +1904,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
"device %s
\n
"
,
cdev
->
dev
.
bus_id
);
return
;
}
dev
=
(
struct
net_device
*
)
(
ch
->
netdev
);
if
(
dev
==
NULL
)
{
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)
fsm_event
(
ch
->
fsm
,
CH_EVENT_STOP
,
ch
);
}
}
static
void
static
void
dev_action_restart
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
{
struct
net_device
*
dev
=
(
struct
net_device
*
)
arg
;
struct
ctc_priv
*
privptr
=
dev
->
priv
;
DBF_TEXT
(
trace
,
3
,
__FUNCTION__
);
ctc_pr_debug
(
"%s: Restarting
\n
"
,
dev
->
name
);
dev_action_stop
(
fi
,
event
,
arg
);
...
...
@@ -2179,7 +2179,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
DBF_TEXT
(
trace
,
5
,
__FUNCTION__
);
/* 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.
*/
spin_lock_irqsave
(
&
ch
->
collect_lock
,
saveflags
);
...
...
@@ -2379,7 +2379,7 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev)
/**
* 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
)
{
fsm_event
(
privptr
->
fsm
,
DEV_EVENT_START
,
dev
);
...
...
@@ -2717,7 +2717,7 @@ ctc_remove_files(struct device *dev)
/**
* Add ctc specific attributes.
* Add ctc private data.
*
*
* @param cgdev pointer to ccwgroup_device just added
*
* @returns 0 on success, !0 on failure.
...
...
@@ -2848,7 +2848,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
DBF_TEXT
(
setup
,
3
,
buffer
);
type
=
get_channel_type
(
&
cgdev
->
cdev
[
0
]
->
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
);
...
...
@@ -2883,7 +2883,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
channel_get
(
type
,
direction
==
READ
?
read_id
:
write_id
,
direction
);
if
(
privptr
->
channel
[
direction
]
==
NULL
)
{
if
(
direction
==
WRITE
)
if
(
direction
==
WRITE
)
channel_free
(
privptr
->
channel
[
READ
]);
ctc_free_netdevice
(
dev
,
1
);
...
...
@@ -2931,7 +2931,7 @@ ctc_shutdown_device(struct ccwgroup_device *cgdev)
{
struct
ctc_priv
*
priv
;
struct
net_device
*
ndev
;
DBF_TEXT
(
setup
,
3
,
__FUNCTION__
);
pr_debug
(
"%s() called
\n
"
,
__FUNCTION__
);
...
...
drivers/s390/net/cu3088.c
View file @
983f27d3
...
...
@@ -20,7 +20,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/err.h>
...
...
@@ -77,7 +77,7 @@ group_write(struct device_driver *drv, const char *buf, size_t count)
int
len
;
if
(
!
(
end
=
strchr
(
start
,
delim
[
i
])))
return
count
;
return
-
EINVAL
;
len
=
min_t
(
ptrdiff_t
,
BUS_ID_SIZE
,
end
-
start
+
1
);
strlcpy
(
bus_ids
[
i
],
start
,
len
);
argv
[
i
]
=
bus_ids
[
i
];
...
...
@@ -94,7 +94,7 @@ static DRIVER_ATTR(group, 0200, NULL, group_write);
/* Register-unregister for ctc&lcs */
int
register_cu3088_discipline
(
struct
ccwgroup_driver
*
dcp
)
register_cu3088_discipline
(
struct
ccwgroup_driver
*
dcp
)
{
int
rc
;
...
...
@@ -109,7 +109,7 @@ register_cu3088_discipline(struct ccwgroup_driver *dcp)
rc
=
driver_create_file
(
&
dcp
->
driver
,
&
driver_attr_group
);
if
(
rc
)
ccwgroup_driver_unregister
(
dcp
);
return
rc
;
}
...
...
@@ -137,7 +137,7 @@ static int __init
cu3088_init
(
void
)
{
int
rc
;
cu3088_root_dev
=
s390_root_dev_register
(
"cu3088"
);
if
(
IS_ERR
(
cu3088_root_dev
))
return
PTR_ERR
(
cu3088_root_dev
);
...
...
drivers/s390/net/iucv.c
View file @
983f27d3
/*
/*
* IUCV network driver
*
* Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
...
...
@@ -28,7 +28,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
/* #define DEBUG */
#include <linux/module.h>
...
...
@@ -81,7 +81,7 @@ iucv_bus_match (struct device *dev, struct device_driver *drv)
struct
bus_type
iucv_bus
=
{
.
name
=
"iucv"
,
.
match
=
iucv_bus_match
,
};
};
struct
device
*
iucv_root
;
...
...
@@ -297,7 +297,7 @@ MODULE_LICENSE("GPL");
/*
* Debugging stuff
*******************************************************************************/
#ifdef DEBUG
static
int
debuglevel
=
0
;
...
...
@@ -344,7 +344,7 @@ do { \
/*
* Internal functions
*******************************************************************************/
/**
* print start banner
*/
...
...
@@ -810,7 +810,7 @@ iucv_register_program (__u8 pgmname[16],
sizeof
(
new_handler
->
id
.
userid
));
EBC_TOUPPER
(
new_handler
->
id
.
userid
,
sizeof
(
new_handler
->
id
.
userid
));
if
(
pgmmask
)
{
memcpy
(
new_handler
->
id
.
mask
,
pgmmask
,
sizeof
(
new_handler
->
id
.
mask
));
...
...
@@ -1229,7 +1229,7 @@ iucv_purge (__u16 pathid, __u32 msgid, __u32 srccls, __u32 *audit)
/* parm->ipaudit has only 3 bytes */
*
audit
>>=
8
;
}
release_param
(
parm
);
iucv_debug
(
1
,
"b2f0_result = %ld"
,
b2f0_result
);
...
...
@@ -2330,14 +2330,14 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
temp_buff1
[
j
]
&=
(
h
->
id
.
mask
)[
j
];
temp_buff2
[
j
]
&=
(
h
->
id
.
mask
)[
j
];
}
iucv_dumpit
(
"temp_buff1:"
,
temp_buff1
,
sizeof
(
temp_buff1
));
iucv_dumpit
(
"temp_buff2"
,
temp_buff2
,
sizeof
(
temp_buff2
));
if
(
!
memcmp
(
temp_buff1
,
temp_buff2
,
24
))
{
iucv_debug
(
2
,
"found a matching handler"
);
break
;
...
...
@@ -2368,7 +2368,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
}
else
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
break
;
case
0x02
:
/*connection complete */
if
(
messagesDisabled
)
{
iucv_setmask
(
~
0
);
...
...
@@ -2387,7 +2387,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
}
else
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
break
;
case
0x03
:
/* connection severed */
if
(
messagesDisabled
)
{
iucv_setmask
(
~
0
);
...
...
@@ -2398,13 +2398,13 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
interrupt
->
ConnectionSevered
(
(
iucv_ConnectionSevered
*
)
int_buf
,
h
->
pgm_data
);
else
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
}
else
iucv_sever
(
int_buf
->
ippathid
,
no_listener
);
break
;
case
0x04
:
/* connection quiesced */
if
(
messagesDisabled
)
{
iucv_setmask
(
~
0
);
...
...
@@ -2420,7 +2420,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"ConnectionQuiesced not called"
);
}
break
;
case
0x05
:
/* connection resumed */
if
(
messagesDisabled
)
{
iucv_setmask
(
~
0
);
...
...
@@ -2436,7 +2436,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"ConnectionResumed not called"
);
}
break
;
case
0x06
:
/* priority message complete */
case
0x07
:
/* nonpriority message complete */
if
(
h
)
{
...
...
@@ -2449,7 +2449,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"MessageComplete not called"
);
}
break
;
case
0x08
:
/* priority message pending */
case
0x09
:
/* nonpriority message pending */
if
(
h
)
{
...
...
@@ -2467,7 +2467,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
__FUNCTION__
);
break
;
}
/* end switch */
iucv_debug
(
2
,
"exiting pathid %d, type %02X"
,
int_buf
->
ippathid
,
int_buf
->
iptype
);
...
...
drivers/s390/net/iucv.h
View file @
983f27d3
...
...
@@ -4,7 +4,7 @@
*
* S390 version
* 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)
*
*
...
...
@@ -16,17 +16,17 @@
* CP Programming Services book, also available on the web
* thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
*
* Definition of Return Codes
* -All positive return codes including zero are reflected back
* from CP except for iucv_register_program. The definition of each
* 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
* - Return Code of:
* (-EINVAL) Invalid value
* (-ENOMEM) storage allocation failed
* Definition of Return Codes
* -All positive return codes including zero are reflected back
* from CP except for iucv_register_program. The definition of each
* 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
* - Return Code of:
* (-EINVAL) Invalid value
* (-ENOMEM) storage allocation failed
* pgmask defined in iucv_register_program will be set depending on input
* paramters.
*
* paramters.
*
*/
#include <linux/types.h>
...
...
@@ -124,13 +124,13 @@ iucv_hex_dump(unsigned char *buf, size_t len)
#define iucv_handle_t void *
/* flags1:
* All flags are defined in the field IPFLAGS1 of each function
* and can be found in CP Programming Services.
* IPLOCAL - Indicates the connect can only be satisfied on the
* local system
* IPPRTY - Indicates a priority message
* IPQUSCE - Indicates you do not want to receive messages on a
* path until an iucv_resume is issued
* All flags are defined in the field IPFLAGS1 of each function
* and can be found in CP Programming Services.
* IPLOCAL - Indicates the connect can only be satisfied on the
* local system
* IPPRTY - Indicates a priority message
* IPQUSCE - Indicates you do not want to receive messages on a
* path until an iucv_resume is issued
* IPRMDATA - Indicates that the message is in the parameter list
*/
#define IPLOCAL 0x01
...
...
@@ -154,14 +154,14 @@ iucv_hex_dump(unsigned char *buf, size_t len)
#define AllInterrupts 0xf8
/*
* Mapping of external interrupt buffers should be used with the corresponding
* interrupt types.
* Names: iucv_ConnectionPending -> connection pending
* interrupt types.
* Names: iucv_ConnectionPending -> connection pending
* iucv_ConnectionComplete -> connection complete
* iucv_ConnectionSevered -> connection severed
* iucv_ConnectionQuiesced -> connection quiesced
* iucv_ConnectionResumed -> connection resumed
* iucv_MessagePending -> message pending
* iucv_MessageComplete -> message complete
* iucv_ConnectionSevered -> connection severed
* iucv_ConnectionQuiesced -> connection quiesced
* iucv_ConnectionResumed -> connection resumed
* iucv_MessagePending -> message pending
* iucv_MessageComplete -> message complete
*/
typedef
struct
{
u16
ippathid
;
...
...
@@ -260,16 +260,16 @@ typedef struct {
uchar
res2
[
3
];
}
iucv_MessageComplete
;
/*
* iucv_interrupt_ops_t: Is a vector of functions that handle
* IUCV interrupts.
* Parameter list:
* eib - is a pointer to a 40-byte area described
* with one of the structures above.
* pgm_data - this data is strictly for the
* interrupt handler that is passed by
* the application. This may be an address
* or token.
/*
* iucv_interrupt_ops_t: Is a vector of functions that handle
* IUCV interrupts.
* Parameter list:
* eib - is a pointer to a 40-byte area described
* with one of the structures above.
* pgm_data - this data is strictly for the
* interrupt handler that is passed by
* the application. This may be an address
* or token.
*/
typedef
struct
{
void
(
*
ConnectionPending
)
(
iucv_ConnectionPending
*
eib
,
...
...
@@ -287,8 +287,8 @@ typedef struct {
}
iucv_interrupt_ops_t
;
/*
*iucv_array_t : Defines buffer array.
* Inside the array may be 31- bit addresses and 31-bit lengths.
*iucv_array_t : Defines buffer array.
* Inside the array may be 31- bit addresses and 31-bit lengths.
*/
typedef
struct
{
u32
address
;
...
...
@@ -299,19 +299,19 @@ extern struct bus_type iucv_bus;
extern
struct
device
*
iucv_root
;
/* -prototypes- */
/*
* Name: iucv_register_program
* Purpose: Registers an application with IUCV
* Input: prmname - user identification
/*
* Name: iucv_register_program
* Purpose: Registers an application with IUCV
* Input: prmname - user identification
* userid - machine identification
* pgmmask - indicates which bits in the prmname and userid combined will be
* used to determine who is given control
* ops - address of vector of interrupt handlers
* pgm_data- application data passed to interrupt handlers
* Output: NA
* Return: address of handler
* ops - address of vector of interrupt handlers
* pgm_data- application data passed to interrupt handlers
* Output: NA
* Return: address of handler
* (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
],
uchar
userid
[
8
],
...
...
@@ -319,13 +319,13 @@ iucv_handle_t iucv_register_program (uchar pgmname[16],
iucv_interrupt_ops_t
*
ops
,
void
*
pgm_data
);
/*
* Name: iucv_unregister_program
* Purpose: Unregister application with IUCV
* Input: address of handler
* Output: NA
* Return: (0) - Normal return
* (-EINVAL) - Internal error, wild pointer
/*
* Name: iucv_unregister_program
* Purpose: Unregister application with IUCV
* Input: address of handler
* Output: NA
* Return: (0) - Normal return
* (-EINVAL) - Internal error, wild pointer
*/
int
iucv_unregister_program
(
iucv_handle_t
handle
);
...
...
@@ -333,7 +333,7 @@ int iucv_unregister_program (iucv_handle_t handle);
* Name: iucv_accept
* Purpose: This function is issued after the user receives a Connection Pending external
* 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.
* user_data - uchar[16], Data specified by the iucv_connect function.
* flags1 - int, Contains options for this path.
...
...
@@ -358,34 +358,34 @@ int iucv_accept (u16 pathid,
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
* successfully, you are not able to use the path until you receive an IUCV
* Connection Complete external interrupt.
* Input: pathid - u16 *, Path identification number
* msglim_reqstd - u16, Number of outstanding messages requested
* user_data - uchar[16], 16-byte user data
* successfully, you are not able to use the path until you receive an IUCV
* Connection Complete external interrupt.
* Input: pathid - u16 *, Path identification number
* msglim_reqstd - u16, Number of outstanding messages requested
* user_data - uchar[16], 16-byte user data
* 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.
* -IPPRTY - 0x20, Specifies if you want to send priority message.
* -IPRMDATA - 0x80, Specifies whether your program can handle a message
* 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.
* -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
* specified.
* specified.
* flags1_out - int * Contains information about the path
* - IPPRTY - 0x20, Indicates you may send priority messages.
* msglim - * u16, Number of outstanding messages
* handle - iucv_handle_t, Address of handler
* pgm_data - void *, Application data passed to interrupt handlers
* handle - iucv_handle_t, Address of handler
* pgm_data - void *, Application data passed to interrupt handlers
* Output: return code from CP IUCV call
* rc - return code from iucv_declare_buffer
* -EINVAL - Invalid handle passed by application
* -EINVAL - Pathid address is NULL
* add_pathid_result - Return code from internal function add_pathid
* -EINVAL - Invalid handle passed by application
* -EINVAL - Pathid address is NULL
* add_pathid_result - Return code from internal function add_pathid
*/
int
iucv_connect
(
u16
*
pathid
,
...
...
@@ -397,16 +397,16 @@ int
int
*
flags1_out
,
u16
*
msglim
,
iucv_handle_t
handle
,
void
*
pgm_data
);
/*
* Name: iucv_purge
* Purpose: This function cancels a message that you have sent.
* Input: pathid - Path identification number.
/*
* Name: iucv_purge
* Purpose: This function cancels a message that you have sent.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID of the message to be purged.
* srccls - Specifies the source message class.
* Output: audit - Contains information about asynchronous error
* that may have affected the normal completion
* of this message.
* Return: Return code from CP IUCV call.
* srccls - Specifies the source message class.
* Output: audit - Contains information about asynchronous error
* that may have affected the normal completion
* of this message.
* Return: Return code from CP IUCV call.
*/
int
iucv_purge
(
u16
pathid
,
u32
msgid
,
u32
srccls
,
__u32
*
audit
);
/*
...
...
@@ -426,38 +426,38 @@ ulong iucv_query_maxconn (void);
*/
ulong
iucv_query_bufsize
(
void
);
/*
* Name: iucv_quiesce
* Purpose: This function temporarily suspends incoming messages on an
* IUCV path. You can later reactivate the path by invoking
* the iucv_resume function.
* Input: pathid - Path identification number
* user_data - 16-bytes of user data
* Output: NA
* Return: Return code from CP IUCV call.
/*
* Name: iucv_quiesce
* Purpose: This function temporarily suspends incoming messages on an
* IUCV path. You can later reactivate the path by invoking
* the iucv_resume function.
* Input: pathid - Path identification number
* user_data - 16-bytes of user data
* Output: NA
* Return: Return code from CP IUCV call.
*/
int
iucv_quiesce
(
u16
pathid
,
uchar
user_data
[
16
]);
/*
* Name: iucv_receive
* Purpose: This function receives messages that are being sent to you
/*
* Name: iucv_receive
* Purpose: This function receives messages that are being sent to you
* over established paths. Data will be returned in buffer for length of
* buflen.
* Input:
* pathid - Path identification number.
* buffer - Address of buffer to receive.
* buflen - Length of buffer to receive.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* Output:
* Input:
* pathid - Path identification number.
* buffer - Address of buffer to receive.
* buflen - Length of buffer to receive.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* Output:
* flags1_out: int *, Contains information about this path.
* IPNORPY - 0x10 Specifies this is a one-way message and no reply is
* expected.
* IPPRTY - 0x20 Specifies if you want to send priority message.
* expected.
* IPPRTY - 0x20 Specifies if you want to send priority message.
* IPRMDATA - 0x80 specifies the data is contained in the parameter list
* residual_buffer - address of buffer updated by the number
* of bytes you have received.
* residual_length -
* residual_length -
* Contains one of the following values, if the receive buffer is:
* The same length as the message, this field is zero.
* Longer than the message, this field contains the number of
...
...
@@ -466,8 +466,8 @@ int iucv_quiesce (u16 pathid, uchar user_data[16]);
* count (that is, the number of bytes remaining in the
* message that does not fit into the buffer. In this
* case b2f0_result = 5.
* Return: Return code from CP IUCV call.
* (-EINVAL) - buffer address is pointing to NULL
* Return: Return code from CP IUCV call.
* (-EINVAL) - buffer address is pointing to NULL
*/
int
iucv_receive
(
u16
pathid
,
u32
msgid
,
...
...
@@ -477,16 +477,16 @@ int iucv_receive (u16 pathid,
int
*
flags1_out
,
ulong
*
residual_buffer
,
ulong
*
residual_length
);
/*
* Name: iucv_receive_array
* Purpose: This function receives messages that are being sent to you
/*
* Name: iucv_receive_array
* Purpose: This function receives messages that are being sent to you
* over established paths. Data will be returned in first buffer for
* length of first buffer.
* Input: pathid - Path identification number.
* Input: pathid - Path identification number.
* msgid - specifies the message ID.
* trgcls - Specifies target class.
* buffer - Address of array of buffers.
* buflen - Total length of buffers.
* buffer - Address of array of buffers.
* buflen - Total length of buffers.
* Output:
* flags1_out: int *, Contains information about this path.
* IPNORPY - 0x10 Specifies this is a one-way message and no reply is
...
...
@@ -504,8 +504,8 @@ int iucv_receive (u16 pathid,
* count (that is, the number of bytes remaining in the
* message that does not fit into the buffer. In this
* case b2f0_result = 5.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
*/
int
iucv_receive_array
(
u16
pathid
,
u32
msgid
,
...
...
@@ -515,44 +515,44 @@ int iucv_receive_array (u16 pathid,
int
*
flags1_out
,
ulong
*
residual_buffer
,
ulong
*
residual_length
);
/*
* Name: iucv_reject
* Purpose: The reject function refuses a specified message. Between the
* time you are notified of a message and the time that you
* complete the message, the message may be rejected.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* Output: NA
* Return: Return code from CP IUCV call.
/*
* Name: iucv_reject
* Purpose: The reject function refuses a specified message. Between the
* time you are notified of a message and the time that you
* complete the message, the message may be rejected.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* Output: NA
* Return: Return code from CP IUCV call.
*/
int
iucv_reject
(
u16
pathid
,
u32
msgid
,
u32
trgcls
);
/*
* Name: iucv_reply
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
/*
* Name: iucv_reply
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* flags1 - Option for path.
* IPPRTY- 0x20, Specifies if you want to send priority message.
* buffer - Address of reply buffer.
* buflen - Length of reply buffer.
* Output: residual_buffer - Address of buffer updated by the number
* of bytes you have moved.
* IPPRTY- 0x20, Specifies if you want to send priority message.
* buffer - Address of reply buffer.
* buflen - Length of reply buffer.
* Output: residual_buffer - Address of buffer updated by the number
* of bytes you have moved.
* residual_length - Contains one of the following values:
* If the answer buffer is the same length as the reply, this field
* contains zero.
* 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
* a residual count (that is, the number of bytes remianing in the
* reply that does not fit into the buffer. In this
* case b2f0_result = 5.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
*/
int
iucv_reply
(
u16
pathid
,
u32
msgid
,
...
...
@@ -561,20 +561,20 @@ int iucv_reply (u16 pathid,
void
*
buffer
,
ulong
buflen
,
ulong
*
residual_buffer
,
ulong
*
residual_length
);
/*
* Name: iucv_reply_array
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* The array identifies a list of addresses and lengths of
* discontiguous buffers that contains the reply data.
* Input: pathid - Path identification number
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
/*
* Name: iucv_reply_array
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* The array identifies a list of addresses and lengths of
* discontiguous buffers that contains the reply data.
* Input: pathid - Path identification number
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* flags1 - Option for path.
* IPPRTY- 0x20, Specifies if you want to send priority message.
* buffer - Address of array of reply buffers.
* buflen - Total length of reply buffers.
* buffer - Address of array of reply buffers.
* buflen - Total length of reply buffers.
* Output: residual_buffer - Address of buffer which IUCV is currently working on.
* residual_length - Contains one of the following values:
* If the answer buffer is the same length as the reply, this field
...
...
@@ -585,8 +585,8 @@ int iucv_reply (u16 pathid,
* a residual count (that is, the number of bytes remianing in the
* reply that does not fit into the buffer. In this
* case b2f0_result = 5.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
*/
int
iucv_reply_array
(
u16
pathid
,
u32
msgid
,
...
...
@@ -596,77 +596,77 @@ int iucv_reply_array (u16 pathid,
ulong
buflen
,
ulong
*
residual_address
,
ulong
*
residual_length
);
/*
* Name: iucv_reply_prmmsg
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* Prmmsg signifies the data is moved into the
* parameter list.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
/*
* Name: iucv_reply_prmmsg
* Purpose: This function responds to the two-way messages that you
* receive. You must identify completely the message to
* which you wish to reply. ie, pathid, msgid, and trgcls.
* Prmmsg signifies the data is moved into the
* parameter list.
* Input: pathid - Path identification number.
* msgid - Specifies the message ID.
* trgcls - Specifies target class.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* prmmsg - 8-bytes of data to be placed into the parameter.
* list.
* Output: NA
* Return: Return code from CP IUCV call.
* prmmsg - 8-bytes of data to be placed into the parameter.
* list.
* Output: NA
* Return: Return code from CP IUCV call.
*/
int
iucv_reply_prmmsg
(
u16
pathid
,
u32
msgid
,
u32
trgcls
,
int
flags1
,
uchar
prmmsg
[
8
]);
/*
* Name: iucv_resume
* Purpose: This function restores communications over a quiesced path
* Input: pathid - Path identification number.
* user_data - 16-bytes of user data.
* Output: NA
* Return: Return code from CP IUCV call.
/*
* Name: iucv_resume
* Purpose: This function restores communications over a quiesced path
* Input: pathid - Path identification number.
* user_data - 16-bytes of user data.
* Output: NA
* Return: Return code from CP IUCV call.
*/
int
iucv_resume
(
u16
pathid
,
uchar
user_data
[
16
]);
/*
* Name: iucv_send
* Purpose: This function transmits data to another application.
* Data to be transmitted is in a buffer and this is a
* one-way message and the receiver will not reply to the
* message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
/*
* Name: iucv_send
* Purpose: This function transmits data to another application.
* Data to be transmitted is in a buffer and this is a
* one-way message and the receiver will not reply to the
* message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* buffer - Address of send buffer.
* buflen - Length of send buffer.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* buffer - Address of send buffer.
* buflen - Length of send buffer.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
*/
int
iucv_send
(
u16
pathid
,
u32
*
msgid
,
u32
trgcls
,
u32
srccls
,
u32
msgtag
,
int
flags1
,
void
*
buffer
,
ulong
buflen
);
/*
* Name: iucv_send_array
* Purpose: This function transmits data to another application.
* The contents of buffer is the address of the array of
* addresses and lengths of discontiguous buffers that hold
* the message text. This is a one-way message and the
* receiver will not reply to the message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
/*
* Name: iucv_send_array
* Purpose: This function transmits data to another application.
* The contents of buffer is the address of the array of
* addresses and lengths of discontiguous buffers that hold
* the message text. This is a one-way message and the
* receiver will not reply to the message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated witht the message.
* flags1 - Option for path.
* IPPRTY- specifies if you want to send priority message.
* buffer - Address of array of send buffers.
* buflen - Total length of send buffers.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* IPPRTY- specifies if you want to send priority message.
* buffer - Address of array of send buffers.
* buflen - Total length of send buffers.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
*/
int
iucv_send_array
(
u16
pathid
,
u32
*
msgid
,
...
...
@@ -675,48 +675,48 @@ int iucv_send_array (u16 pathid,
u32
msgtag
,
int
flags1
,
iucv_array_t
*
buffer
,
ulong
buflen
);
/*
* Name: iucv_send_prmmsg
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a one-way message and the
* receiver will not reply to the message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
/*
* Name: iucv_send_prmmsg
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a one-way message and the
* receiver will not reply to the message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* IPPRTY- 0x20 specifies if you want to send priority message.
* prmmsg - 8-bytes of data to be placed into parameter list.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* prmmsg - 8-bytes of data to be placed into parameter list.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
*/
int
iucv_send_prmmsg
(
u16
pathid
,
u32
*
msgid
,
u32
trgcls
,
u32
srccls
,
u32
msgtag
,
int
flags1
,
uchar
prmmsg
[
8
]);
/*
* Name: iucv_send2way
* Purpose: This function transmits data to another application.
* Data to be transmitted is in a buffer. The receiver
* of the send is expected to reply to the message and
* a buffer is provided into which IUCV moves the reply
* to this message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag associated with the message.
/*
* Name: iucv_send2way
* Purpose: This function transmits data to another application.
* Data to be transmitted is in a buffer. The receiver
* of the send is expected to reply to the message and
* a buffer is provided into which IUCV moves the reply
* to this message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag associated with the message.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* buffer - Address of send buffer.
* buflen - Length of send buffer.
* ansbuf - Address of buffer into which IUCV moves the reply of
* this message.
* anslen - Address of length of buffer.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer or ansbuf address is NULL.
* buffer - Address of send buffer.
* buflen - Length of send buffer.
* ansbuf - Address of buffer into which IUCV moves the reply of
* this message.
* anslen - Address of length of buffer.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer or ansbuf address is NULL.
*/
int
iucv_send2way
(
u16
pathid
,
u32
*
msgid
,
...
...
@@ -726,28 +726,28 @@ int iucv_send2way (u16 pathid,
int
flags1
,
void
*
buffer
,
ulong
buflen
,
void
*
ansbuf
,
ulong
anslen
);
/*
* Name: iucv_send2way_array
* Purpose: This function transmits data to another application.
* The contents of buffer is the address of the array of
* addresses and lengths of discontiguous buffers that hold
* the message text. The receiver of the send is expected to
* reply to the message and a buffer is provided into which
* IUCV moves the reply to this message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
/*
* Name: iucv_send2way_array
* Purpose: This function transmits data to another application.
* The contents of buffer is the address of the array of
* addresses and lengths of discontiguous buffers that hold
* the message text. The receiver of the send is expected to
* reply to the message and a buffer is provided into which
* IUCV moves the reply to this message.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* buffer - Sddress of array of send buffers.
* buflen - Total length of send buffers.
* ansbuf - Address of array of buffer into which IUCV moves the reply
* of this message.
* anslen - Address of length reply buffers.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* buffer - Sddress of array of send buffers.
* buflen - Total length of send buffers.
* ansbuf - Address of array of buffer into which IUCV moves the reply
* of this message.
* anslen - Address of length reply buffers.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
*/
int
iucv_send2way_array
(
u16
pathid
,
u32
*
msgid
,
...
...
@@ -758,27 +758,27 @@ int iucv_send2way_array (u16 pathid,
iucv_array_t
*
buffer
,
ulong
buflen
,
iucv_array_t
*
ansbuf
,
ulong
anslen
);
/*
* Name: iucv_send2way_prmmsg
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a two-way message and the
* receiver of the message is expected to reply. A buffer
* is provided into which IUCV moves the reply to this
* message.
* Input: pathid - Rath identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
/*
* Name: iucv_send2way_prmmsg
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a two-way message and the
* receiver of the message is expected to reply. A buffer
* is provided into which IUCV moves the reply to this
* message.
* Input: pathid - Rath identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* IPPRTY- 0x20 Specifies if you want to send priority message.
* prmmsg - 8-bytes of data to be placed in parameter list.
* ansbuf - Address of buffer into which IUCV moves the reply of
* prmmsg - 8-bytes of data to be placed in parameter list.
* ansbuf - Address of buffer into which IUCV moves the reply of
* this message.
* anslen - Address of length of buffer.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
* anslen - Address of length of buffer.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Buffer address is NULL.
*/
int
iucv_send2way_prmmsg
(
u16
pathid
,
u32
*
msgid
,
...
...
@@ -788,29 +788,29 @@ int iucv_send2way_prmmsg (u16 pathid,
ulong
flags1
,
uchar
prmmsg
[
8
],
void
*
ansbuf
,
ulong
anslen
);
/*
* Name: iucv_send2way_prmmsg_array
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a two-way message and the
* receiver of the message is expected to reply. A buffer
* is provided into which IUCV moves the reply to this
* message. The contents of ansbuf is the address of the
* array of addresses and lengths of discontiguous buffers
* that contain the reply.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
/*
* Name: iucv_send2way_prmmsg_array
* Purpose: This function transmits data to another application.
* Prmmsg specifies that the 8-bytes of data are to be moved
* into the parameter list. This is a two-way message and the
* receiver of the message is expected to reply. A buffer
* is provided into which IUCV moves the reply to this
* message. The contents of ansbuf is the address of the
* array of addresses and lengths of discontiguous buffers
* that contain the reply.
* Input: pathid - Path identification number.
* trgcls - Specifies target class.
* srccls - Specifies the source message class.
* msgtag - Specifies a tag to be associated with the message.
* flags1 - Option for path.
* 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
* of this message.
* anslen - Address of length of reply buffers.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Ansbuf address is NULL.
* of this message.
* anslen - Address of length of reply buffers.
* Output: msgid - Specifies the message ID.
* Return: Return code from CP IUCV call.
* (-EINVAL) - Ansbuf address is NULL.
*/
int
iucv_send2way_prmmsg_array
(
u16
pathid
,
u32
*
msgid
,
...
...
@@ -821,29 +821,29 @@ int iucv_send2way_prmmsg_array (u16 pathid,
uchar
prmmsg
[
8
],
iucv_array_t
*
ansbuf
,
ulong
anslen
);
/*
* Name: iucv_setmask
* Purpose: This function enables or disables the following IUCV
* external interruptions: Nonpriority and priority message
* interrupts, nonpriority and priority reply interrupts.
/*
* Name: iucv_setmask
* Purpose: This function enables or disables the following IUCV
* external interruptions: Nonpriority and priority message
* interrupts, nonpriority and priority reply interrupts.
* Input: SetMaskFlag - options for interrupts
* 0x80 - Nonpriority_MessagePendingInterruptsFlag
* 0x40 - Priority_MessagePendingInterruptsFlag
* 0x20 - Nonpriority_MessageCompletionInterruptsFlag
* 0x10 - Priority_MessageCompletionInterruptsFlag
* 0x80 - Nonpriority_MessagePendingInterruptsFlag
* 0x40 - Priority_MessagePendingInterruptsFlag
* 0x20 - Nonpriority_MessageCompletionInterruptsFlag
* 0x10 - Priority_MessageCompletionInterruptsFlag
* 0x08 - IUCVControlInterruptsFlag
* Output: NA
* Return: Return code from CP IUCV call.
* Output: NA
* Return: Return code from CP IUCV call.
*/
int
iucv_setmask
(
int
SetMaskFlag
);
/*
* Name: iucv_sever
* Purpose: This function terminates an IUCV path.
* Input: pathid - Path identification number.
* user_data - 16-bytes of user data.
* Output: NA
* Return: Return code from CP IUCV call.
* (-EINVAL) - Interal error, wild pointer.
/*
* Name: iucv_sever
* Purpose: This function terminates an IUCV path.
* Input: pathid - Path identification number.
* user_data - 16-bytes of user data.
* Output: NA
* Return: Return code from CP IUCV call.
* (-EINVAL) - Interal error, wild pointer.
*/
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);
static
void
lcs_start_kernel_thread
(
struct
lcs_card
*
card
);
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_recovery
(
void
*
ptr
);
/**
* Debug Facility Stuff
...
...
@@ -429,12 +430,6 @@ lcs_setup_card(struct lcs_card *card)
card
->
tx_buffer
=
NULL
;
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
);
spin_lock_init
(
&
card
->
lock
);
spin_lock_init
(
&
card
->
ipm_lock
);
...
...
@@ -675,8 +670,9 @@ lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
int
index
,
rc
;
LCS_DBF_TEXT
(
5
,
trace
,
"rdybuff"
);
BUG_ON
(
buffer
->
state
!=
BUF_STATE_LOCKED
&&
buffer
->
state
!=
BUF_STATE_PROCESSED
);
if
(
buffer
->
state
!=
BUF_STATE_LOCKED
&&
buffer
->
state
!=
BUF_STATE_PROCESSED
)
BUG
();
spin_lock_irqsave
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
buffer
->
state
=
BUF_STATE_READY
;
index
=
buffer
-
channel
->
iob
;
...
...
@@ -700,7 +696,8 @@ __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
int
index
,
prev
,
next
;
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
;
index
=
buffer
-
channel
->
iob
;
prev
=
(
index
-
1
)
&
(
LCS_NUM_BUFFS
-
1
);
...
...
@@ -732,8 +729,9 @@ lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
unsigned
long
flags
;
LCS_DBF_TEXT
(
5
,
trace
,
"relbuff"
);
BUG_ON
(
buffer
->
state
!=
BUF_STATE_LOCKED
&&
buffer
->
state
!=
BUF_STATE_PROCESSED
);
if
(
buffer
->
state
!=
BUF_STATE_LOCKED
&&
buffer
->
state
!=
BUF_STATE_PROCESSED
)
BUG
();
spin_lock_irqsave
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
buffer
->
state
=
BUF_STATE_EMPTY
;
spin_unlock_irqrestore
(
get_ccwdev_lock
(
channel
->
ccwdev
),
flags
);
...
...
@@ -1147,8 +1145,6 @@ lcs_fix_multicast_list(struct lcs_card *card)
list_add_tail
(
&
ipm
->
list
,
&
card
->
ipm_list
);
}
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)
if
(
ipm
!=
NULL
)
continue
;
/* Address already in 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
)
{
PRINT_INFO
(
"Not enough memory to add "
"new multicast entry!
\n
"
);
break
;
}
memset
(
ipm
,
0
,
sizeof
(
struct
lcs_ipm_list
));
memcpy
(
&
ipm
->
ipm
.
mac_addr
,
buf
,
LCS_MAC_LENGTH
);
ipm
->
ipm
.
ip_addr
=
im4
->
multiaddr
;
ipm
->
ipm_state
=
LCS_IPM_STATE_SET_REQUIRED
;
spin_lock_irqsave
(
&
card
->
ipm_lock
,
flags
);
LCS_DBF_HEX
(
2
,
trace
,
&
ipm
->
ipm
.
ip_addr
,
4
);
list_add
(
&
ipm
->
list
,
&
card
->
ipm_list
);
spin_unlock_irqrestore
(
&
card
->
ipm_lock
,
flags
);
}
...
...
@@ -1269,7 +1265,15 @@ lcs_register_mc_addresses(void *data)
read_unlock
(
&
in4_dev
->
mc_list_lock
);
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
);
if
(
card
->
state
==
DEV_STATE_UP
)
{
netif_carrier_on
(
card
->
dev
);
netif_wake_queue
(
card
->
dev
);
}
out:
lcs_clear_thread_running_bit
(
card
,
LCS_SET_MC_THREAD
);
return
0
;
...
...
@@ -1286,7 +1290,7 @@ lcs_set_multicast_list(struct net_device *dev)
LCS_DBF_TEXT
(
4
,
trace
,
"setmulti"
);
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
);
}
...
...
@@ -1318,6 +1322,53 @@ lcs_check_irb_error(struct ccw_device *cdev, struct irb *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
...
...
@@ -1327,7 +1378,8 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
{
struct
lcs_card
*
card
;
struct
lcs_channel
*
channel
;
int
index
;
int
rc
,
index
;
int
cstat
,
dstat
;
if
(
lcs_check_irb_error
(
cdev
,
irb
))
return
;
...
...
@@ -1338,14 +1390,27 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
else
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
,
"%4x%4x"
,
irb
->
scsw
.
cstat
,
irb
->
scsw
.
dstat
);
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? */
if
((
channel
->
state
!=
CH_STATE_INIT
)
&&
(
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
;
if
((
irb
->
scsw
.
actl
&
SCSW_ACTL_SUSPENDED
)
||
(
irb
->
scsw
.
cstat
&
SCHN_STAT_PCI
))
...
...
@@ -1367,7 +1432,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
else
if
(
irb
->
scsw
.
actl
&
SCSW_ACTL_SUSPENDED
)
/* CCW execution stopped on a suspend bit. */
channel
->
state
=
CH_STATE_SUSPENDED
;
if
(
irb
->
scsw
.
fctl
&
SCSW_FCTL_HALT_FUNC
)
{
if
(
irb
->
scsw
.
cc
!=
0
)
{
ccw_device_halt
(
channel
->
ccwdev
,
(
addr_t
)
channel
);
...
...
@@ -1376,7 +1440,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
/* The channel has been stopped by halt_IO. */
channel
->
state
=
CH_STATE_HALTED
;
}
if
(
irb
->
scsw
.
fctl
&
SCSW_FCTL_CLEAR_FUNC
)
{
channel
->
state
=
CH_STATE_CLEARED
;
}
...
...
@@ -1452,7 +1515,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
lcs_release_buffer
(
channel
,
buffer
);
card
=
(
struct
lcs_card
*
)
((
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
);
spin_lock
(
&
card
->
lock
);
card
->
tx_emitted
--
;
...
...
@@ -1488,6 +1551,10 @@ __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb,
card
->
stats
.
tx_carrier_errors
++
;
return
0
;
}
if
(
skb
->
protocol
==
htons
(
ETH_P_IPV6
))
{
dev_kfree_skb
(
skb
);
return
0
;
}
netif_stop_queue
(
card
->
dev
);
spin_lock
(
&
card
->
lock
);
if
(
card
->
tx_buffer
!=
NULL
&&
...
...
@@ -1632,30 +1699,6 @@ lcs_detect(struct lcs_card *card)
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
*/
...
...
@@ -1679,111 +1722,6 @@ lcs_stopcard(struct lcs_card *card)
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
*/
...
...
@@ -1791,15 +1729,12 @@ static void
lcs_start_kernel_thread
(
struct
lcs_card
*
card
)
{
LCS_DBF_TEXT
(
5
,
trace
,
"krnthrd"
);
if
(
lcs_do_start_thread
(
card
,
LCS_STARTUP_THREAD
))
kernel_thread
(
lcs_lgw_startup_thread
,
(
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
);
if
(
lcs_do_start_thread
(
card
,
LCS_RECOVERY_THREAD
))
kernel_thread
(
lcs_recovery
,
(
void
*
)
card
,
SIGCHLD
);
#ifdef CONFIG_IP_MULTICAST
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
}
...
...
@@ -1813,19 +1748,14 @@ lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd)
if
(
cmd
->
initiator
==
LCS_INITIATOR_LGW
)
{
switch
(
cmd
->
cmd_code
)
{
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
:
if
(
!
lcs_set_thread_start_bit
(
card
,
LCS_STARTLAN_THREAD
))
schedule_work
(
&
card
->
kernel_thread_starter
);
lcs_schedule_recovery
(
card
);
break
;
case
LCS_CMD_STOPLAN
:
if
(
!
lcs_set_thread_start_bit
(
card
,
LCS_STOPLAN_THREAD
))
schedule_work
(
&
card
->
kernel_thread_starter
);
PRINT_WARN
(
"Stoplan for %s initiated by LGW.
\n
"
,
card
->
dev
->
name
);
if
(
card
->
dev
)
netif_carrier_off
(
card
->
dev
);
break
;
default:
PRINT_INFO
(
"UNRECOGNIZED LGW COMMAND
\n
"
);
...
...
@@ -1941,8 +1871,11 @@ lcs_stop_device(struct net_device *dev)
LCS_DBF_TEXT
(
2
,
trace
,
"stopdev"
);
card
=
(
struct
lcs_card
*
)
dev
->
priv
;
netif_stop_queue
(
dev
);
netif_carrier_off
(
dev
);
netif_tx_disable
(
dev
);
dev
->
flags
&=
~
IFF_UP
;
wait_event
(
card
->
write
.
wait_q
,
(
card
->
write
.
state
!=
CH_STATE_RUNNING
));
rc
=
lcs_stopcard
(
card
);
if
(
rc
)
PRINT_ERR
(
"Try it again!
\n
"
);
...
...
@@ -1968,6 +1901,7 @@ lcs_open_device(struct net_device *dev)
}
else
{
dev
->
flags
|=
IFF_UP
;
netif_carrier_on
(
dev
);
netif_wake_queue
(
dev
);
card
->
state
=
DEV_STATE_UP
;
}
...
...
@@ -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
);
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
[]
=
{
&
dev_attr_portno
.
attr
,
&
dev_attr_type
.
attr
,
&
dev_attr_lancmd_timeout
.
attr
,
&
dev_attr_recover
.
attr
,
NULL
,
};
...
...
@@ -2099,6 +2054,12 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev)
ccwgdev
->
dev
.
driver_data
=
card
;
ccwgdev
->
cdev
[
0
]
->
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
;
}
...
...
@@ -2200,6 +2161,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
if
(
recover_state
==
DEV_STATE_RECOVER
)
{
lcs_set_multicast_list
(
card
->
dev
);
card
->
dev
->
flags
|=
IFF_UP
;
netif_carrier_on
(
card
->
dev
);
netif_wake_queue
(
card
->
dev
);
card
->
state
=
DEV_STATE_UP
;
}
else
{
...
...
@@ -2229,7 +2191,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
* lcs_shutdown_device, called when setting the group device offline.
*/
static
int
lcs_shutdown_device
(
struct
ccwgroup_device
*
ccwgdev
)
__lcs_shutdown_device
(
struct
ccwgroup_device
*
ccwgdev
,
int
recovery_mode
)
{
struct
lcs_card
*
card
;
enum
lcs_dev_states
recover_state
;
...
...
@@ -2239,9 +2201,11 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
card
=
(
struct
lcs_card
*
)
ccwgdev
->
dev
.
driver_data
;
if
(
!
card
)
return
-
ENODEV
;
lcs_set_allowed_threads
(
card
,
0
);
if
(
lcs_wait_for_threads
(
card
,
LCS_SET_MC_THREAD
))
return
-
ERESTARTSYS
;
if
(
recovery_mode
==
0
)
{
lcs_set_allowed_threads
(
card
,
0
);
if
(
lcs_wait_for_threads
(
card
,
LCS_SET_MC_THREAD
))
return
-
ERESTARTSYS
;
}
LCS_DBF_HEX
(
3
,
setup
,
&
card
,
sizeof
(
void
*
));
recover_state
=
card
->
state
;
...
...
@@ -2256,6 +2220,43 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
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
*/
...
...
drivers/s390/net/lcs.h
View file @
983f27d3
...
...
@@ -73,13 +73,17 @@ do { \
/**
* 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_EQUIPMENT_CHECK 0x10
#define LCS_SENSE_BUS_OUT_CHECK 0x20
#define LCS_SENSE_INTERVENTION_REQUIRED 0x40
#define LCS_SENSE_CMD_REJECT 0x80
#define LCS_SENSE_RESETTING_EVENT 0x
00
80
#define LCS_SENSE_DEVICE_ONLINE 0x
00
20
#define LCS_SENSE_RESETTING_EVENT 0x80
#define LCS_SENSE_DEVICE_ONLINE 0x20
/**
* LCS packet type definitions
...
...
@@ -152,10 +156,9 @@ enum lcs_dev_states {
enum
lcs_threads
{
LCS_SET_MC_THREAD
=
1
,
LCS_STARTLAN_THREAD
=
2
,
LCS_STOPLAN_THREAD
=
4
,
LCS_STARTUP_THREAD
=
8
,
LCS_RECOVERY_THREAD
=
2
,
};
/**
* LCS struct declarations
*/
...
...
@@ -286,6 +289,7 @@ struct lcs_card {
struct
net_device_stats
stats
;
unsigned
short
(
*
lan_type_trans
)(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
);
struct
ccwgroup_device
*
gdev
;
struct
lcs_channel
read
;
struct
lcs_channel
write
;
struct
lcs_buffer
*
tx_buffer
;
...
...
drivers/s390/net/netiucv.c
View file @
983f27d3
...
...
@@ -30,7 +30,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#undef DEBUG
#include <linux/module.h>
...
...
@@ -65,7 +65,7 @@ MODULE_AUTHOR
(
"(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)"
);
MODULE_DESCRIPTION
(
"Linux for S/390 IUCV network driver"
);
#define PRINTK_HEADER " iucv: "
/* for debugging */
static
struct
device_driver
netiucv_driver
=
{
...
...
@@ -202,7 +202,7 @@ netiucv_printname(char *name)
*
p
=
'\0'
;
return
tmp
;
}
/**
* States of the interface statemachine.
*/
...
...
@@ -244,7 +244,7 @@ static const char *dev_event_names[] = {
"Connection up"
,
"Connection down"
,
};
/**
* Events of the connection statemachine
*/
...
...
@@ -364,7 +364,7 @@ static const char *conn_state_names[] = {
"Connect error"
,
};
/**
* Debug Facility Stuff
*/
...
...
@@ -516,7 +516,7 @@ static void
fsm_action_nop
(
fsm_instance
*
fi
,
int
event
,
void
*
arg
)
{
}
/**
* Actions of the connection statemachine
*****************************************************************************/
...
...
@@ -993,7 +993,7 @@ static const fsm_node conn_fsm[] = {
static
const
int
CONN_FSM_LEN
=
sizeof
(
conn_fsm
)
/
sizeof
(
fsm_node
);
/**
* Actions for interface - statemachine.
*****************************************************************************/
...
...
@@ -1182,7 +1182,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
fsm_newstate
(
conn
->
fsm
,
CONN_STATE_TX
);
conn
->
prof
.
send_stamp
=
xtime
;
rc
=
iucv_send
(
conn
->
pathid
,
NULL
,
0
,
0
,
1
/* single_flag */
,
0
,
nskb
->
data
,
nskb
->
len
);
/* Shut up, gcc! nskb is always below 2G. */
...
...
@@ -1220,7 +1220,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
return
rc
;
}
/**
* Interface API for upper network layers
*****************************************************************************/
...
...
@@ -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
* and throw away packet.
* and throw away packet.
*/
if
(
fsm_getstate
(
privptr
->
fsm
)
!=
DEV_STATE_RUNNING
)
{
fsm_event
(
privptr
->
fsm
,
DEV_EVENT_START
,
dev
);
...
...
@@ -1538,7 +1538,7 @@ static ssize_t
maxcq_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
priv
->
conn
->
prof
.
maxcqueue
=
0
;
return
count
;
...
...
@@ -1559,7 +1559,7 @@ static ssize_t
sdoio_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
priv
->
conn
->
prof
.
doios_single
=
0
;
return
count
;
...
...
@@ -1580,7 +1580,7 @@ static ssize_t
mdoio_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
5
,
__FUNCTION__
);
priv
->
conn
->
prof
.
doios_multi
=
0
;
return
count
;
...
...
@@ -1601,7 +1601,7 @@ static ssize_t
txlen_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
priv
->
conn
->
prof
.
txlen
=
0
;
return
count
;
...
...
@@ -1622,7 +1622,7 @@ static ssize_t
txtime_write
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
const
char
*
buf
,
size_t
count
)
{
struct
netiucv_priv
*
priv
=
dev
->
driver_data
;
IUCV_DBF_TEXT
(
trace
,
4
,
__FUNCTION__
);
priv
->
conn
->
prof
.
tx_time
=
0
;
return
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
));
return
count
;
out_free_ndev:
...
...
@@ -2099,7 +2099,7 @@ static int __init
netiucv_init
(
void
)
{
int
ret
;
ret
=
iucv_register_dbf_views
();
if
(
ret
)
{
PRINT_WARN
(
"netiucv_init failed, "
...
...
@@ -2128,7 +2128,7 @@ netiucv_init(void)
}
return
ret
;
}
module_init
(
netiucv_init
);
module_exit
(
netiucv_exit
);
MODULE_LICENSE
(
"GPL"
);
drivers/s390/net/qeth.h
View file @
983f27d3
...
...
@@ -376,7 +376,7 @@ struct qeth_hdr_osn {
__u8
reserved3
[
18
];
__u32
ccid
;
}
__attribute__
((
packed
));
struct
qeth_hdr
{
union
{
struct
qeth_hdr_layer2
l2
;
...
...
@@ -825,7 +825,7 @@ struct qeth_card {
int
use_hard_stop
;
int
(
*
orig_hard_header
)(
struct
sk_buff
*
,
struct
net_device
*
,
unsigned
short
,
void
*
,
void
*
,
unsigned
);
struct
qeth_osn_info
osn_info
;
struct
qeth_osn_info
osn_info
;
};
struct
qeth_card_list_struct
{
...
...
@@ -944,7 +944,7 @@ qeth_get_netdev_flags(struct qeth_card *card)
return
0
;
switch
(
card
->
info
.
type
)
{
case
QETH_CARD_TYPE_IQD
:
case
QETH_CARD_TYPE_OSN
:
case
QETH_CARD_TYPE_OSN
:
return
IFF_NOARP
;
#ifdef CONFIG_QETH_IPV6
default:
...
...
@@ -981,7 +981,7 @@ static inline int
qeth_get_max_mtu_for_card
(
int
cardtype
)
{
switch
(
cardtype
)
{
case
QETH_CARD_TYPE_UNKNOWN
:
case
QETH_CARD_TYPE_OSAE
:
case
QETH_CARD_TYPE_OSN
:
...
...
@@ -1097,9 +1097,9 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr)
int
count
=
0
,
rc
=
0
;
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
);
if
(
rc
!=
4
||
count
)
if
(
rc
!=
4
||
count
<=
0
)
return
-
EINVAL
;
for
(
count
=
0
;
count
<
4
;
count
++
)
{
if
(
in
[
count
]
>
255
)
...
...
@@ -1131,7 +1131,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
cnt
=
out
=
found
=
save_cnt
=
num2
=
0
;
end
=
start
=
(
char
*
)
buf
;
in
=
(
__u16
*
)
addr
;
in
=
(
__u16
*
)
addr
;
memset
(
in
,
0
,
16
);
while
(
end
)
{
end
=
strchr
(
end
,
':'
);
...
...
@@ -1139,7 +1139,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
end
=
(
char
*
)
buf
+
(
strlen
(
buf
));
out
=
1
;
}
if
((
end
-
start
))
{
if
((
end
-
start
))
{
memset
(
num
,
0
,
5
);
memcpy
(
num
,
start
,
end
-
start
);
if
(
!
qeth_isxdigit
(
num
))
...
...
@@ -1241,5 +1241,5 @@ qeth_osn_register(unsigned char *read_dev_no,
extern
void
qeth_osn_deregister
(
struct
net_device
*
);
#endif
/* __QETH_H__ */
drivers/s390/net/qeth_eddp.c
View file @
983f27d3
...
...
@@ -81,7 +81,7 @@ void
qeth_eddp_buf_release_contexts
(
struct
qeth_qdio_out_buffer
*
buf
)
{
struct
qeth_eddp_context_reference
*
ref
;
QETH_DBF_TEXT
(
trace
,
6
,
"eddprctx"
);
while
(
!
list_empty
(
&
buf
->
ctx_list
)){
ref
=
list_entry
(
buf
->
ctx_list
.
next
,
...
...
@@ -135,7 +135,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
"buffer!
\n
"
);
goto
out
;
}
}
}
/* check if the whole next skb fits into current buffer */
if
((
QETH_MAX_BUFFER_ELEMENTS
(
queue
->
card
)
-
buf
->
next_element_to_fill
)
...
...
@@ -148,7 +148,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
* and increment ctx's refcnt */
must_refcnt
=
1
;
continue
;
}
}
if
(
must_refcnt
){
must_refcnt
=
0
;
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,
int
left_in_frag
;
int
copy_len
;
u8
*
src
;
QETH_DBF_TEXT
(
trace
,
5
,
"eddpcdtc"
);
if
(
skb_shinfo
(
eddp
->
skb
)
->
nr_frags
==
0
)
{
memcpy
(
dst
,
eddp
->
skb
->
data
+
eddp
->
skb_offset
,
len
);
...
...
@@ -408,7 +408,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
struct
tcphdr
*
tcph
;
int
data_len
;
u32
hcsum
;
QETH_DBF_TEXT
(
trace
,
5
,
"eddpftcp"
);
eddp
->
skb_offset
=
sizeof
(
struct
qeth_hdr
)
+
eddp
->
nhl
+
eddp
->
thl
;
if
(
eddp
->
qh
.
hdr
.
l2
.
id
==
QETH_HEADER_TYPE_LAYER2
)
{
...
...
@@ -465,13 +465,13 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
eddp
->
th
.
tcp
.
h
.
seq
+=
data_len
;
}
}
static
inline
int
qeth_eddp_fill_context_tcp
(
struct
qeth_eddp_context
*
ctx
,
struct
sk_buff
*
skb
,
struct
qeth_hdr
*
qhdr
)
{
struct
qeth_eddp_data
*
eddp
=
NULL
;
QETH_DBF_TEXT
(
trace
,
5
,
"eddpficx"
);
/* create our segmentation headers and copy original headers */
if
(
skb
->
protocol
==
ETH_P_IP
)
...
...
@@ -512,7 +512,7 @@ qeth_eddp_calc_num_pages(struct qeth_eddp_context *ctx, struct sk_buff *skb,
int
hdr_len
)
{
int
skbs_per_page
;
QETH_DBF_TEXT
(
trace
,
5
,
"eddpcanp"
);
/* can we put multiple skbs in one page? */
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,
struct
qeth_hdr
*
qhdr
)
{
struct
qeth_eddp_context
*
ctx
=
NULL
;
QETH_DBF_TEXT
(
trace
,
5
,
"creddpct"
);
if
(
skb
->
protocol
==
ETH_P_IP
)
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);
extern
void
qeth_remove_device_attributes_osn
(
struct
device
*
dev
);
extern
int
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)
QETH_DBF_TEXT
(
setup
,
3
,
"setoffl"
);
QETH_DBF_HEX
(
setup
,
3
,
&
card
,
sizeof
(
void
*
));
if
(
card
->
dev
&&
netif_carrier_ok
(
card
->
dev
))
netif_carrier_off
(
card
->
dev
);
recover_flag
=
card
->
state
;
...
...
@@ -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
)
{
if
(
card
->
options
.
layer2
)
{
if
((
addr
->
type
==
todo
->
type
)
&&
(
memcmp
(
&
addr
->
mac
,
&
todo
->
mac
,
(
memcmp
(
&
addr
->
mac
,
&
todo
->
mac
,
OSA_ADDR_LEN
)
==
0
))
{
found
=
1
;
break
;
}
continue
;
}
}
if
((
addr
->
proto
==
QETH_PROT_IPV4
)
&&
(
todo
->
proto
==
QETH_PROT_IPV4
)
&&
(
addr
->
type
==
todo
->
type
)
&&
...
...
@@ -694,13 +694,13 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
if
(
card
->
options
.
layer2
)
{
if
((
tmp
->
type
==
addr
->
type
)
&&
(
tmp
->
is_multicast
==
addr
->
is_multicast
)
&&
(
memcmp
(
&
tmp
->
mac
,
&
addr
->
mac
,
(
memcmp
(
&
tmp
->
mac
,
&
addr
->
mac
,
OSA_ADDR_LEN
)
==
0
))
{
found
=
1
;
break
;
}
continue
;
}
}
if
((
tmp
->
proto
==
QETH_PROT_IPV4
)
&&
(
addr
->
proto
==
QETH_PROT_IPV4
)
&&
(
tmp
->
type
==
addr
->
type
)
&&
...
...
@@ -1173,7 +1173,7 @@ qeth_determine_card_type(struct qeth_card *card)
"due to hardware limitations!
\n
"
);
card
->
qdio
.
no_out_queues
=
1
;
card
->
qdio
.
default_out_queue
=
0
;
}
}
return
0
;
}
i
++
;
...
...
@@ -1198,7 +1198,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
return
-
ENODEV
;
QETH_DBF_TEXT_
(
setup
,
2
,
"%s"
,
gdev
->
dev
.
bus_id
);
card
=
qeth_alloc_card
();
if
(
!
card
)
{
put_device
(
dev
);
...
...
@@ -1220,7 +1220,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
put_device
(
dev
);
qeth_free_card
(
card
);
return
rc
;
}
}
if
((
rc
=
qeth_setup_card
(
card
))){
QETH_DBF_TEXT_
(
setup
,
2
,
"2err%d"
,
rc
);
put_device
(
dev
);
...
...
@@ -1843,7 +1843,7 @@ struct qeth_cmd_buffer *iob)
&
card
->
seqno
.
pdu_hdr_ack
,
QETH_SEQ_NO_LENGTH
);
QETH_DBF_HEX
(
control
,
2
,
iob
->
data
,
QETH_DBF_CONTROL_LEN
);
}
static
int
qeth_send_control_data
(
struct
qeth_card
*
card
,
int
len
,
struct
qeth_cmd_buffer
*
iob
,
...
...
@@ -1937,7 +1937,7 @@ qeth_osn_send_control_data(struct qeth_card *card, int len,
wake_up
(
&
card
->
wait_q
);
}
return
rc
;
}
}
static
inline
void
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,
memcpy
(
QETH_IPA_PDU_LEN_PDU3
(
iob
->
data
),
&
s2
,
2
);
return
qeth_osn_send_control_data
(
card
,
s1
,
iob
);
}
static
int
qeth_send_ipa_cmd
(
struct
qeth_card
*
card
,
struct
qeth_cmd_buffer
*
iob
,
int
(
*
reply_cb
)
...
...
@@ -2579,7 +2579,7 @@ qeth_process_inbound_buffer(struct qeth_card *card,
skb
->
dev
=
card
->
dev
;
if
(
hdr
->
hdr
.
l2
.
id
==
QETH_HEADER_TYPE_LAYER2
)
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
);
else
{
/*in case of OSN*/
skb_push
(
skb
,
sizeof
(
struct
qeth_hdr
));
...
...
@@ -2763,7 +2763,7 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
index
=
i
%
QDIO_MAX_BUFFERS_PER_Q
;
buffer
=
&
card
->
qdio
.
in_q
->
bufs
[
index
];
if
(
!
((
status
&
QDIO_STATUS_LOOK_FOR_ERROR
)
&&
qeth_check_qdio_errors
(
buffer
->
buffer
,
qeth_check_qdio_errors
(
buffer
->
buffer
,
qdio_err
,
siga_err
,
"qinerr"
)))
qeth_process_inbound_buffer
(
card
,
buffer
,
index
);
/* clear buffer and give back to hardware */
...
...
@@ -3187,7 +3187,7 @@ qeth_alloc_qdio_buffers(struct qeth_card *card)
if
(
card
->
qdio
.
state
==
QETH_QDIO_ALLOCATED
)
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
);
if
(
!
card
->
qdio
.
in_q
)
return
-
ENOMEM
;
...
...
@@ -3476,7 +3476,7 @@ qeth_halt_channels(struct qeth_card *card)
rc3
=
qeth_halt_channel
(
&
card
->
data
);
if
(
rc1
)
return
rc1
;
if
(
rc2
)
if
(
rc2
)
return
rc2
;
return
rc3
;
}
...
...
@@ -3491,7 +3491,7 @@ qeth_clear_channels(struct qeth_card *card)
rc3
=
qeth_clear_channel
(
&
card
->
data
);
if
(
rc1
)
return
rc1
;
if
(
rc2
)
if
(
rc2
)
return
rc2
;
return
rc3
;
}
...
...
@@ -3798,10 +3798,10 @@ qeth_open(struct net_device *dev)
QETH_DBF_TEXT
(
trace
,
4
,
"nomacadr"
);
return
-
EPERM
;
}
card
->
dev
->
flags
|=
IFF_UP
;
netif_start_queue
(
dev
);
card
->
data
.
state
=
CH_STATE_UP
;
card
->
state
=
CARD_STATE_UP
;
card
->
dev
->
flags
|=
IFF_UP
;
netif_start_queue
(
dev
);
if
(
!
card
->
lan_online
&&
netif_carrier_ok
(
dev
))
netif_carrier_off
(
dev
);
...
...
@@ -3817,7 +3817,7 @@ qeth_stop(struct net_device *dev)
card
=
(
struct
qeth_card
*
)
dev
->
priv
;
netif_
stop_queu
e
(
dev
);
netif_
tx_disabl
e
(
dev
);
card
->
dev
->
flags
&=
~
IFF_UP
;
if
(
card
->
state
==
CARD_STATE_UP
)
card
->
state
=
CARD_STATE_SOFTSETUP
;
...
...
@@ -3958,7 +3958,7 @@ qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
#endif
*
hdr
=
(
struct
qeth_hdr
*
)
qeth_push_skb
(
card
,
skb
,
sizeof
(
struct
qeth_hdr
));
if
(
hdr
==
NULL
)
if
(
*
hdr
==
NULL
)
return
-
EINVAL
;
return
0
;
}
...
...
@@ -4098,7 +4098,7 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
}
}
else
{
/* passthrough */
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
))
{
hdr
->
hdr
.
l3
.
flags
=
QETH_CAST_BROADCAST
|
QETH_HDR_PASSTHRU
;
...
...
@@ -4385,7 +4385,7 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
}
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
)
{
int
elements_needed
=
0
;
...
...
@@ -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
;
struct
qeth_eddp_context
*
ctx
=
NULL
;
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
;
QETH_DBF_TEXT
(
trace
,
6
,
"sendpkt"
);
...
...
@@ -4441,7 +4443,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
return
0
;
}
cast_type
=
qeth_get_cast_type
(
card
,
skb
);
if
((
cast_type
==
RTN_BROADCAST
)
&&
if
((
cast_type
==
RTN_BROADCAST
)
&&
(
card
->
info
.
broadcast_capable
==
0
)){
card
->
stats
.
tx_dropped
++
;
card
->
stats
.
tx_errors
++
;
...
...
@@ -4463,7 +4465,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
card
->
stats
.
tx_errors
++
;
dev_kfree_skb_any
(
skb
);
return
NETDEV_TX_OK
;
}
}
elements_needed
++
;
}
else
{
if
((
rc
=
qeth_prepare_skb
(
card
,
&
skb
,
&
hdr
,
ipv
)))
{
...
...
@@ -4498,16 +4500,16 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
card
->
stats
.
tx_packets
++
;
card
->
stats
.
tx_bytes
+=
tx_bytes
;
#ifdef CONFIG_QETH_PERF_STATS
if
(
skb_shinfo
(
skb
)
->
tso_size
&&
if
(
tso_size
&&
!
(
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
++
;
}
if
(
skb_shinfo
(
skb
)
->
nr_frags
>
0
){
if
(
nr_frags
>
0
){
card
->
perf_stats
.
sg_skbs_sent
++
;
/* nr_frags + skb->data */
card
->
perf_stats
.
sg_frags_sent
+=
skb_shinfo
(
skb
)
->
nr_frags
+
1
;
nr_frags
+
1
;
}
#endif
/* CONFIG_QETH_PERF_STATS */
}
...
...
@@ -5373,7 +5375,7 @@ qeth_layer2_send_setdelvlan_cb(struct qeth_card *card,
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
if
(
cmd
->
hdr
.
return_code
)
{
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_DBF_TEXT_
(
trace
,
2
,
"L2VL%4x"
,
cmd
->
hdr
.
command
);
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,
iob
=
qeth_get_ipacmd_buffer
(
card
,
ipacmd
,
QETH_PROT_IPV4
);
cmd
=
(
struct
qeth_ipa_cmd
*
)(
iob
->
data
+
IPA_PDU_HEADER_SIZE
);
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
);
}
...
...
@@ -5457,7 +5459,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
* Examine hardware response to SET_PROMISC_MODE
*/
static
int
qeth_setadp_promisc_mode_cb
(
struct
qeth_card
*
card
,
qeth_setadp_promisc_mode_cb
(
struct
qeth_card
*
card
,
struct
qeth_reply
*
reply
,
unsigned
long
data
)
{
...
...
@@ -5468,10 +5470,10 @@ qeth_setadp_promisc_mode_cb(struct qeth_card *card,
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
setparms
=
&
(
cmd
->
data
.
setadapterparms
);
qeth_default_setadapterparms_cb
(
card
,
reply
,
(
unsigned
long
)
cmd
);
if
(
cmd
->
hdr
.
return_code
)
{
QETH_DBF_TEXT_
(
trace
,
4
,
"prmrc%2.2x"
,
cmd
->
hdr
.
return_code
);
if
(
cmd
->
hdr
.
return_code
)
{
QETH_DBF_TEXT_
(
trace
,
4
,
"prmrc%2.2x"
,
cmd
->
hdr
.
return_code
);
setparms
->
data
.
mode
=
SET_PROMISC_MODE_OFF
;
}
card
->
info
.
promisc_mode
=
setparms
->
data
.
mode
;
...
...
@@ -5517,7 +5519,7 @@ qeth_set_multicast_list(struct net_device *dev)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
return
;
QETH_DBF_TEXT
(
trace
,
3
,
"setmulti"
);
qeth_delete_mc_addresses
(
card
);
if
(
card
->
options
.
layer2
)
{
...
...
@@ -5575,7 +5577,7 @@ qeth_osn_assist(struct net_device *dev,
struct
qeth_cmd_buffer
*
iob
;
struct
qeth_card
*
card
;
int
rc
;
QETH_DBF_TEXT
(
trace
,
2
,
"osnsdmc"
);
if
(
!
dev
)
return
-
ENODEV
;
...
...
@@ -5654,7 +5656,7 @@ qeth_osn_deregister(struct net_device * dev)
card
->
osn_info
.
data_cb
=
NULL
;
return
;
}
static
void
qeth_delete_mc_addresses
(
struct
qeth_card
*
card
)
{
...
...
@@ -5818,7 +5820,7 @@ qeth_add_multicast_ipv6(struct qeth_card *card)
struct
inet6_dev
*
in6_dev
;
QETH_DBF_TEXT
(
trace
,
4
,
"chkmcv6"
);
if
(
!
qeth_is_supported
(
card
,
IPA_IPV6
))
if
(
!
qeth_is_supported
(
card
,
IPA_IPV6
))
return
;
in6_dev
=
in6_dev_get
(
card
->
dev
);
if
(
in6_dev
==
NULL
)
...
...
@@ -6359,12 +6361,9 @@ qeth_netdev_init(struct net_device *dev)
dev
->
vlan_rx_kill_vid
=
qeth_vlan_rx_kill_vid
;
dev
->
vlan_rx_add_vid
=
qeth_vlan_rx_add_vid
;
#endif
dev
->
hard_header
=
card
->
orig_hard_header
;
if
(
qeth_get_netdev_flags
(
card
)
&
IFF_NOARP
)
{
dev
->
rebuild_header
=
NULL
;
dev
->
hard_header
=
NULL
;
if
(
card
->
options
.
fake_ll
)
dev
->
hard_header
=
qeth_fake_header
;
dev
->
header_cache_update
=
NULL
;
dev
->
hard_header_cache
=
NULL
;
}
...
...
@@ -6373,6 +6372,9 @@ qeth_netdev_init(struct net_device *dev)
if
(
!
(
card
->
info
.
unique_id
&
UNIQUE_ID_NOT_BY_CARD
))
card
->
dev
->
dev_id
=
card
->
info
.
unique_id
&
0xffff
;
#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
->
set_mac_address
=
qeth_layer2_set_mac_address
;
dev
->
flags
|=
qeth_get_netdev_flags
(
card
);
...
...
@@ -6477,6 +6479,9 @@ qeth_hardsetup_card(struct qeth_card *card)
/*network device will be recovered*/
if
(
card
->
dev
)
{
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
;
}
/* at first set_online allocate netdev */
...
...
@@ -6584,7 +6589,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
cmd
=
(
struct
qeth_ipa_cmd
*
)
data
;
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
,
&
cmd
->
data
.
setadapterparms
.
data
.
change_addr
.
addr
,
OSA_ADDR_LEN
);
...
...
@@ -7031,14 +7036,12 @@ qeth_softsetup_ipv6(struct qeth_card *card)
QETH_DBF_TEXT
(
trace
,
3
,
"softipv6"
);
netif_stop_queue
(
card
->
dev
);
rc
=
qeth_send_startlan
(
card
,
QETH_PROT_IPV6
);
if
(
rc
)
{
PRINT_ERR
(
"IPv6 startlan failed on %s
\n
"
,
QETH_CARD_IFNAME
(
card
));
return
rc
;
}
netif_wake_queue
(
card
->
dev
);
rc
=
qeth_query_ipassists
(
card
,
QETH_PROT_IPV6
);
if
(
rc
)
{
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)
card
->
options
.
large_send
=
type
;
return
0
;
}
netif_stop_queue
(
card
->
dev
);
if
(
card
->
state
==
CARD_STATE_UP
)
netif_tx_disable
(
card
->
dev
);
card
->
options
.
large_send
=
type
;
switch
(
card
->
options
.
large_send
)
{
case
QETH_LARGE_SEND_EDDP
:
...
...
@@ -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
);
break
;
}
netif_wake_queue
(
card
->
dev
);
if
(
card
->
state
==
CARD_STATE_UP
)
netif_wake_queue
(
card
->
dev
);
return
rc
;
}
...
...
@@ -7427,7 +7432,7 @@ qeth_softsetup_card(struct qeth_card *card)
if
((
rc
=
qeth_setrouting_v6
(
card
)))
QETH_DBF_TEXT_
(
setup
,
2
,
"5err%d"
,
rc
);
out:
netif_
stop_queu
e
(
card
->
dev
);
netif_
tx_disabl
e
(
card
->
dev
);
return
0
;
}
...
...
@@ -7567,7 +7572,7 @@ qeth_stop_card(struct qeth_card *card, int recovery_mode)
if
(
card
->
read
.
state
==
CH_STATE_UP
&&
card
->
write
.
state
==
CH_STATE_UP
&&
(
card
->
state
==
CARD_STATE_UP
))
{
if
(
recovery_mode
&&
if
(
recovery_mode
&&
card
->
info
.
type
!=
QETH_CARD_TYPE_OSN
)
{
qeth_stop
(
card
->
dev
);
}
else
{
...
...
@@ -7736,10 +7741,8 @@ static int
qeth_register_netdev
(
struct
qeth_card
*
card
)
{
QETH_DBF_TEXT
(
setup
,
3
,
"regnetd"
);
if
(
card
->
dev
->
reg_state
!=
NETREG_UNINITIALIZED
)
{
qeth_netdev_init
(
card
->
dev
);
if
(
card
->
dev
->
reg_state
!=
NETREG_UNINITIALIZED
)
return
0
;
}
/* sysfs magic */
SET_NETDEV_DEV
(
card
->
dev
,
&
card
->
gdev
->
dev
);
return
register_netdev
(
card
->
dev
);
...
...
@@ -7750,7 +7753,7 @@ qeth_start_again(struct qeth_card *card, int recovery_mode)
{
QETH_DBF_TEXT
(
setup
,
2
,
"startag"
);
if
(
recovery_mode
&&
if
(
recovery_mode
&&
card
->
info
.
type
!=
QETH_CARD_TYPE_OSN
)
{
qeth_open
(
card
->
dev
);
}
else
{
...
...
drivers/s390/net/qeth_mpc.h
View file @
983f27d3
...
...
@@ -445,7 +445,7 @@ enum qeth_ipa_arp_return_codes {
/* Helper functions */
#define IS_IPA_REPLY(cmd) ((cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST) || \
(cmd->hdr.initiator == IPA_CMD_INITIATOR_OSA_REPLY))
/*****************************************************************************/
/* END OF IP Assist related definitions */
/*****************************************************************************/
...
...
@@ -490,7 +490,7 @@ extern unsigned char ULP_ENABLE[];
/* Layer 2 defintions */
#define QETH_PROT_LAYER2 0x08
#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_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)
{
struct
device
*
dev
=
NULL
;
loff_t
nr
=
0
;
down_read
(
&
qeth_ccwgroup_driver
.
driver
.
bus
->
subsys
.
rwsem
);
if
(
*
offset
==
0
)
return
SEQ_START_TOKEN
;
...
...
@@ -60,8 +60,8 @@ static void *
qeth_procfile_seq_next
(
struct
seq_file
*
s
,
void
*
it
,
loff_t
*
offset
)
{
struct
device
*
prev
,
*
next
;
if
(
it
==
SEQ_START_TOKEN
)
if
(
it
==
SEQ_START_TOKEN
)
prev
=
NULL
;
else
prev
=
(
struct
device
*
)
it
;
...
...
@@ -180,7 +180,7 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
struct
device
*
device
;
struct
qeth_card
*
card
;
if
(
it
==
SEQ_START_TOKEN
)
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
}
if
(
card
->
options
.
large_send
==
type
)
return
count
;
if
((
rc
=
qeth_set_large_send
(
card
,
type
)))
if
((
rc
=
qeth_set_large_send
(
card
,
type
)))
return
rc
;
return
count
;
}
...
...
@@ -1682,7 +1682,7 @@ qeth_create_device_attributes(struct device *dev)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
return
sysfs_create_group
(
&
dev
->
kobj
,
&
qeth_osn_device_attr_group
);
if
((
ret
=
sysfs_create_group
(
&
dev
->
kobj
,
&
qeth_device_attr_group
)))
return
ret
;
if
((
ret
=
sysfs_create_group
(
&
dev
->
kobj
,
&
qeth_device_ipato_group
))){
...
...
@@ -1713,7 +1713,7 @@ qeth_remove_device_attributes(struct device *dev)
if
(
card
->
info
.
type
==
QETH_CARD_TYPE_OSN
)
return
sysfs_remove_group
(
&
dev
->
kobj
,
&
qeth_osn_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_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,
int
fragno
;
unsigned
long
addr
;
int
element
,
cnt
,
dlen
;
fragno
=
skb_shinfo
(
skb
)
->
nr_frags
;
element
=
*
next_element_to_fill
;
dlen
=
0
;
if
(
is_tso
)
buffer
->
element
[
element
].
flags
=
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