Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci-2.6.23
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci-2.6.23
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 @@ list_modified:
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 @@ netdev_out:
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 @@ out:
* 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 @@ out:
}
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 @@ retry:
/*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