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