提交 89f8185e 编写于 作者: J Jeff Garzik

Merge branch 'master' into upstream

...@@ -565,7 +565,7 @@ BROADBAND PROCESSOR ARCHITECTURE ...@@ -565,7 +565,7 @@ BROADBAND PROCESSOR ARCHITECTURE
P: Arnd Bergmann P: Arnd Bergmann
M: arnd@arndb.de M: arnd@arndb.de
L: linuxppc-dev@ozlabs.org L: linuxppc-dev@ozlabs.org
W: http://linuxppc64.org W: http://www.penguinppc.org/ppc64/
S: Supported S: Supported
BTTV VIDEO4LINUX DRIVER BTTV VIDEO4LINUX DRIVER
...@@ -1716,7 +1716,7 @@ M: paulus@au.ibm.com ...@@ -1716,7 +1716,7 @@ M: paulus@au.ibm.com
P: Anton Blanchard P: Anton Blanchard
M: anton@samba.org M: anton@samba.org
M: anton@au.ibm.com M: anton@au.ibm.com
W: http://linuxppc64.org W: http://www.penguinppc.org/ppc64/
L: linuxppc-dev@ozlabs.org L: linuxppc-dev@ozlabs.org
S: Supported S: Supported
......
...@@ -2057,10 +2057,45 @@ static void __init flatten_device_tree(void) ...@@ -2057,10 +2057,45 @@ static void __init flatten_device_tree(void)
} }
#ifdef CONFIG_PPC_MAPLE
static void __init fixup_device_tree(void) /* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
* The values are bad, and it doesn't even have the right number of cells. */
static void __init fixup_device_tree_maple(void)
{ {
phandle isa;
u32 isa_ranges[6];
isa = call_prom("finddevice", 1, 1, ADDR("/ht@0/isa@4"));
if (!PHANDLE_VALID(isa))
return;
if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
== PROM_ERROR)
return;
if (isa_ranges[0] != 0x1 ||
isa_ranges[1] != 0xf4000000 ||
isa_ranges[2] != 0x00010000)
return;
prom_printf("fixing up bogus ISA range on Maple...\n");
isa_ranges[0] = 0x1;
isa_ranges[1] = 0x0;
isa_ranges[2] = 0x01002000; /* IO space; PCI device = 4 */
isa_ranges[3] = 0x0;
isa_ranges[4] = 0x0;
isa_ranges[5] = 0x00010000;
prom_setprop(isa, "/ht@0/isa@4", "ranges",
isa_ranges, sizeof(isa_ranges));
}
#else
#define fixup_device_tree_maple()
#endif
#if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC) #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
static void __init fixup_device_tree_pmac(void)
{
phandle u3, i2c, mpic; phandle u3, i2c, mpic;
u32 u3_rev; u32 u3_rev;
u32 interrupts[2]; u32 interrupts[2];
...@@ -2097,9 +2132,16 @@ static void __init fixup_device_tree(void) ...@@ -2097,9 +2132,16 @@ static void __init fixup_device_tree(void)
parent = (u32)mpic; parent = (u32)mpic;
prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent", prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
&parent, sizeof(parent)); &parent, sizeof(parent));
#endif
} }
#else
#define fixup_device_tree_pmac()
#endif
static void __init fixup_device_tree(void)
{
fixup_device_tree_maple();
fixup_device_tree_pmac();
}
static void __init prom_find_boot_cpu(void) static void __init prom_find_boot_cpu(void)
{ {
......
...@@ -134,7 +134,7 @@ main(void) ...@@ -134,7 +134,7 @@ main(void)
DEFINE(TI_TASK, offsetof(struct thread_info, task)); DEFINE(TI_TASK, offsetof(struct thread_info, task));
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain)); DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags));
DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
......
...@@ -279,11 +279,11 @@ static int mpc8272ads_platform_notify(struct device *dev) ...@@ -279,11 +279,11 @@ static int mpc8272ads_platform_notify(struct device *dev)
static const struct platform_notify_dev_map dev_map[] = { static const struct platform_notify_dev_map dev_map[] = {
{ {
.bus_id = "fsl-cpm-fcc", .bus_id = "fsl-cpm-fcc",
.rtn = mpc8272ads_fixup_enet_pdata .rtn = mpc8272ads_fixup_enet_pdata,
}, },
{ {
.bus_id = "fsl-cpm-scc:uart", .bus_id = "fsl-cpm-scc:uart",
.rtn = mpc .rtn = mpc8272ads_fixup_uart_pdata,
}, },
{ {
.bus_id = NULL .bus_id = NULL
...@@ -335,15 +335,15 @@ struct platform_device* early_uart_get_pdev(int index) ...@@ -335,15 +335,15 @@ struct platform_device* early_uart_get_pdev(int index)
struct platform_device* pdev = NULL; struct platform_device* pdev = NULL;
if(index) { /*assume SCC4 here*/ if(index) { /*assume SCC4 here*/
pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC4]; pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC4];
pinfo = &mpc8272<F12>_uart_pdata[1]; pinfo = &mpc8272_uart_pdata[fsid_scc4_uart];
} else { /*over SCC1*/ } else { /*over SCC1*/
pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC1]; pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC1];
pinfo = &mpc8272_uart_pdata[0]; pinfo = &mpc8272_uart_pdata[fsid_scc1_uart];
} }
pinfo->uart_clk = bd->bi_intfreq; pinfo->uart_clk = bd->bi_intfreq;
pdev->dev.platform_data = pinfo; pdev->dev.platform_data = pinfo;
ppc_sys_fixup_mem_resource(pdev, IMAP_ADDR); ppc_sys_fixup_mem_resource(pdev, CPM_MAP_ADDR);
return NULL; return NULL;
} }
......
...@@ -121,13 +121,13 @@ struct platform_device ppc_sys_platform_devices[] = { ...@@ -121,13 +121,13 @@ struct platform_device ppc_sys_platform_devices[] = {
.num_resources = 3, .num_resources = 3,
.resource = (struct resource[]) { .resource = (struct resource[]) {
{ {
.name = "scc_mem", .name = "regs",
.start = 0x11A00, .start = 0x11A00,
.end = 0x11A1F, .end = 0x11A1F,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.name = "scc_pram", .name = "pram",
.start = 0x8000, .start = 0x8000,
.end = 0x80ff, .end = 0x80ff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
...@@ -145,13 +145,13 @@ struct platform_device ppc_sys_platform_devices[] = { ...@@ -145,13 +145,13 @@ struct platform_device ppc_sys_platform_devices[] = {
.num_resources = 3, .num_resources = 3,
.resource = (struct resource[]) { .resource = (struct resource[]) {
{ {
.name = "scc_mem", .name = "regs",
.start = 0x11A20, .start = 0x11A20,
.end = 0x11A3F, .end = 0x11A3F,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.name = "scc_pram", .name = "pram",
.start = 0x8100, .start = 0x8100,
.end = 0x81ff, .end = 0x81ff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
...@@ -169,13 +169,13 @@ struct platform_device ppc_sys_platform_devices[] = { ...@@ -169,13 +169,13 @@ struct platform_device ppc_sys_platform_devices[] = {
.num_resources = 3, .num_resources = 3,
.resource = (struct resource[]) { .resource = (struct resource[]) {
{ {
.name = "scc_mem", .name = "regs",
.start = 0x11A40, .start = 0x11A40,
.end = 0x11A5F, .end = 0x11A5F,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.name = "scc_pram", .name = "pram",
.start = 0x8200, .start = 0x8200,
.end = 0x82ff, .end = 0x82ff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
...@@ -193,13 +193,13 @@ struct platform_device ppc_sys_platform_devices[] = { ...@@ -193,13 +193,13 @@ struct platform_device ppc_sys_platform_devices[] = {
.num_resources = 3, .num_resources = 3,
.resource = (struct resource[]) { .resource = (struct resource[]) {
{ {
.name = "scc_mem", .name = "regs",
.start = 0x11A60, .start = 0x11A60,
.end = 0x11A7F, .end = 0x11A7F,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.name = "scc_pram", .name = "pram",
.start = 0x8300, .start = 0x8300,
.end = 0x83ff, .end = 0x83ff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
......
...@@ -139,13 +139,13 @@ struct ppc_sys_spec ppc_sys_specs[] = { ...@@ -139,13 +139,13 @@ struct ppc_sys_spec ppc_sys_specs[] = {
.ppc_sys_name = "8272", .ppc_sys_name = "8272",
.mask = 0x0000ff00, .mask = 0x0000ff00,
.value = 0x00000c00, .value = 0x00000c00,
.num_devices = 11, .num_devices = 12,
.device_list = (enum ppc_sys_devices[]) .device_list = (enum ppc_sys_devices[])
{ {
MPC82xx_CPM_FCC1, MPC82xx_CPM_FCC2, MPC82xx_CPM_SCC1, MPC82xx_CPM_FCC1, MPC82xx_CPM_FCC2, MPC82xx_CPM_SCC1,
MPC82xx_CPM_SCC2, MPC82xx_CPM_SCC3, MPC82xx_CPM_SMC1, MPC82xx_CPM_SCC2, MPC82xx_CPM_SCC3, MPC82xx_CPM_SCC4,
MPC82xx_CPM_SMC2, MPC82xx_CPM_SPI, MPC82xx_CPM_I2C, MPC82xx_CPM_SMC1, MPC82xx_CPM_SMC2, MPC82xx_CPM_SPI,
MPC82xx_CPM_USB, MPC82xx_SEC1, MPC82xx_CPM_I2C, MPC82xx_CPM_USB, MPC82xx_SEC1,
}, },
}, },
/* below is a list of the 8280 family of processors */ /* below is a list of the 8280 family of processors */
......
...@@ -220,6 +220,7 @@ static void e1000_restore_vlan(struct e1000_adapter *adapter); ...@@ -220,6 +220,7 @@ static void e1000_restore_vlan(struct e1000_adapter *adapter);
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state); static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
static int e1000_resume(struct pci_dev *pdev); static int e1000_resume(struct pci_dev *pdev);
#endif #endif
static void e1000_shutdown(struct pci_dev *pdev);
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
/* for netdump / net console */ /* for netdump / net console */
...@@ -235,8 +236,9 @@ static struct pci_driver e1000_driver = { ...@@ -235,8 +236,9 @@ static struct pci_driver e1000_driver = {
/* Power Managment Hooks */ /* Power Managment Hooks */
#ifdef CONFIG_PM #ifdef CONFIG_PM
.suspend = e1000_suspend, .suspend = e1000_suspend,
.resume = e1000_resume .resume = e1000_resume,
#endif #endif
.shutdown = e1000_shutdown
}; };
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>"); MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
...@@ -4611,6 +4613,12 @@ e1000_resume(struct pci_dev *pdev) ...@@ -4611,6 +4613,12 @@ e1000_resume(struct pci_dev *pdev)
return 0; return 0;
} }
#endif #endif
static void e1000_shutdown(struct pci_dev *pdev)
{
e1000_suspend(pdev, PMSG_SUSPEND);
}
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
/* /*
* Polling 'interrupt' - used by things like netconsole to send skbs * Polling 'interrupt' - used by things like netconsole to send skbs
......
...@@ -1774,8 +1774,6 @@ static int pcnet32_open(struct net_device *dev) ...@@ -1774,8 +1774,6 @@ static int pcnet32_open(struct net_device *dev)
lp->rx_dma_addr[i] = 0; lp->rx_dma_addr[i] = 0;
} }
pcnet32_free_ring(dev);
/* /*
* Switch back to 16bit mode to avoid problems with dumb * Switch back to 16bit mode to avoid problems with dumb
* DOS packet driver after a warm reboot * DOS packet driver after a warm reboot
......
...@@ -1838,7 +1838,7 @@ struct net_device * __init arlan_probe(int unit) ...@@ -1838,7 +1838,7 @@ struct net_device * __init arlan_probe(int unit)
} }
#ifdef MODULE #ifdef MODULE
int init_module(void) int __init init_module(void)
{ {
int i = 0; int i = 0;
...@@ -1860,7 +1860,7 @@ int init_module(void) ...@@ -1860,7 +1860,7 @@ int init_module(void)
} }
void cleanup_module(void) void __exit cleanup_module(void)
{ {
int i = 0; int i = 0;
struct net_device *dev; struct net_device *dev;
......
...@@ -4306,7 +4306,7 @@ struct net_device * __init wavelan_probe(int unit) ...@@ -4306,7 +4306,7 @@ struct net_device * __init wavelan_probe(int unit)
* Insertion of the module * Insertion of the module
* I'm now quite proud of the multi-device support. * I'm now quite proud of the multi-device support.
*/ */
int init_module(void) int __init init_module(void)
{ {
int ret = -EIO; /* Return error if no cards found */ int ret = -EIO; /* Return error if no cards found */
int i; int i;
......
...@@ -1486,13 +1486,13 @@ ch_action_iofatal(fsm_instance * fi, int event, void *arg) ...@@ -1486,13 +1486,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);
...@@ -1624,7 +1624,7 @@ less_than(char *id1, char *id2) ...@@ -1624,7 +1624,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);
} }
...@@ -1895,7 +1895,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) ...@@ -1895,7 +1895,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;
...@@ -1909,7 +1909,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) ...@@ -1909,7 +1909,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",
...@@ -2008,12 +2008,12 @@ dev_action_stop(fsm_instance * fi, int event, void *arg) ...@@ -2008,12 +2008,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);
...@@ -2193,7 +2193,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb) ...@@ -2193,7 +2193,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);
...@@ -2393,7 +2393,7 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev) ...@@ -2393,7 +2393,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);
...@@ -2738,7 +2738,7 @@ ctc_remove_files(struct device *dev) ...@@ -2738,7 +2738,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.
...@@ -2869,7 +2869,7 @@ ctc_new_device(struct ccwgroup_device *cgdev) ...@@ -2869,7 +2869,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);
...@@ -2907,7 +2907,7 @@ ctc_new_device(struct ccwgroup_device *cgdev) ...@@ -2907,7 +2907,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);
...@@ -2955,7 +2955,7 @@ ctc_shutdown_device(struct ccwgroup_device *cgdev) ...@@ -2955,7 +2955,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__);
......
...@@ -130,7 +130,7 @@ ctc_tty_readmodem(ctc_tty_info *info) ...@@ -130,7 +130,7 @@ ctc_tty_readmodem(ctc_tty_info *info)
if ((tty = info->tty)) { if ((tty = info->tty)) {
if (info->mcr & UART_MCR_RTS) { if (info->mcr & UART_MCR_RTS) {
struct sk_buff *skb; struct sk_buff *skb;
if ((skb = skb_dequeue(&info->rx_queue))) { if ((skb = skb_dequeue(&info->rx_queue))) {
int len = skb->len; int len = skb->len;
tty_insert_flip_string(tty, skb->data, len); tty_insert_flip_string(tty, skb->data, len);
...@@ -328,7 +328,7 @@ ctc_tty_inject(ctc_tty_info *info, char c) ...@@ -328,7 +328,7 @@ ctc_tty_inject(ctc_tty_info *info, char c)
{ {
int skb_res; int skb_res;
struct sk_buff *skb; struct sk_buff *skb;
DBF_TEXT(trace, 4, __FUNCTION__); DBF_TEXT(trace, 4, __FUNCTION__);
if (ctc_tty_shuttingdown) if (ctc_tty_shuttingdown)
return; return;
...@@ -497,7 +497,7 @@ ctc_tty_write(struct tty_struct *tty, const u_char * buf, int count) ...@@ -497,7 +497,7 @@ ctc_tty_write(struct tty_struct *tty, const u_char * buf, int count)
c = (count < CTC_TTY_XMIT_SIZE) ? count : CTC_TTY_XMIT_SIZE; c = (count < CTC_TTY_XMIT_SIZE) ? count : CTC_TTY_XMIT_SIZE;
if (c <= 0) if (c <= 0)
break; break;
skb_res = info->netdev->hard_header_len + sizeof(info->mcr) + skb_res = info->netdev->hard_header_len + sizeof(info->mcr) +
+ sizeof(__u32); + sizeof(__u32);
skb = dev_alloc_skb(skb_res + c); skb = dev_alloc_skb(skb_res + c);
...@@ -828,7 +828,7 @@ ctc_tty_block_til_ready(struct tty_struct *tty, struct file *filp, ctc_tty_info ...@@ -828,7 +828,7 @@ ctc_tty_block_til_ready(struct tty_struct *tty, struct file *filp, ctc_tty_info
if (tty_hung_up_p(filp) || if (tty_hung_up_p(filp) ||
(info->flags & CTC_ASYNC_CLOSING)) { (info->flags & CTC_ASYNC_CLOSING)) {
if (info->flags & CTC_ASYNC_CLOSING) if (info->flags & CTC_ASYNC_CLOSING)
wait_event(info->close_wait, wait_event(info->close_wait,
!(info->flags & CTC_ASYNC_CLOSING)); !(info->flags & CTC_ASYNC_CLOSING));
#ifdef MODEM_DO_RESTART #ifdef MODEM_DO_RESTART
if (info->flags & CTC_ASYNC_HUP_NOTIFY) if (info->flags & CTC_ASYNC_HUP_NOTIFY)
...@@ -1247,7 +1247,7 @@ ctc_tty_unregister_netdev(struct net_device *dev) { ...@@ -1247,7 +1247,7 @@ ctc_tty_unregister_netdev(struct net_device *dev) {
void void
ctc_tty_cleanup(void) { ctc_tty_cleanup(void) {
unsigned long saveflags; unsigned long saveflags;
DBF_TEXT(trace, 2, __FUNCTION__); DBF_TEXT(trace, 2, __FUNCTION__);
spin_lock_irqsave(&ctc_tty_lock, saveflags); spin_lock_irqsave(&ctc_tty_lock, saveflags);
ctc_tty_shuttingdown = 1; ctc_tty_shuttingdown = 1;
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/err.h> #include <linux/err.h>
...@@ -77,7 +77,7 @@ group_write(struct device_driver *drv, const char *buf, size_t count) ...@@ -77,7 +77,7 @@ group_write(struct device_driver *drv, const char *buf, size_t count)
int len; int len;
if (!(end = strchr(start, delim[i]))) if (!(end = strchr(start, delim[i])))
return count; return -EINVAL;
len = min_t(ptrdiff_t, BUS_ID_SIZE, end - start + 1); len = min_t(ptrdiff_t, BUS_ID_SIZE, end - start + 1);
strlcpy (bus_ids[i], start, len); strlcpy (bus_ids[i], start, len);
argv[i] = bus_ids[i]; argv[i] = bus_ids[i];
...@@ -94,7 +94,7 @@ static DRIVER_ATTR(group, 0200, NULL, group_write); ...@@ -94,7 +94,7 @@ static DRIVER_ATTR(group, 0200, NULL, group_write);
/* Register-unregister for ctc&lcs */ /* Register-unregister for ctc&lcs */
int int
register_cu3088_discipline(struct ccwgroup_driver *dcp) register_cu3088_discipline(struct ccwgroup_driver *dcp)
{ {
int rc; int rc;
...@@ -109,7 +109,7 @@ register_cu3088_discipline(struct ccwgroup_driver *dcp) ...@@ -109,7 +109,7 @@ register_cu3088_discipline(struct ccwgroup_driver *dcp)
rc = driver_create_file(&dcp->driver, &driver_attr_group); rc = driver_create_file(&dcp->driver, &driver_attr_group);
if (rc) if (rc)
ccwgroup_driver_unregister(dcp); ccwgroup_driver_unregister(dcp);
return rc; return rc;
} }
...@@ -137,7 +137,7 @@ static int __init ...@@ -137,7 +137,7 @@ static int __init
cu3088_init (void) cu3088_init (void)
{ {
int rc; int rc;
cu3088_root_dev = s390_root_dev_register("cu3088"); cu3088_root_dev = s390_root_dev_register("cu3088");
if (IS_ERR(cu3088_root_dev)) if (IS_ERR(cu3088_root_dev))
return PTR_ERR(cu3088_root_dev); return PTR_ERR(cu3088_root_dev);
......
/* /*
* IUCV network driver * IUCV network driver
* *
* Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
*/ */
/* #define DEBUG */ /* #define DEBUG */
#include <linux/module.h> #include <linux/module.h>
...@@ -81,7 +81,7 @@ iucv_bus_match (struct device *dev, struct device_driver *drv) ...@@ -81,7 +81,7 @@ iucv_bus_match (struct device *dev, struct device_driver *drv)
struct bus_type iucv_bus = { struct bus_type iucv_bus = {
.name = "iucv", .name = "iucv",
.match = iucv_bus_match, .match = iucv_bus_match,
}; };
struct device *iucv_root; struct device *iucv_root;
...@@ -297,7 +297,7 @@ MODULE_LICENSE("GPL"); ...@@ -297,7 +297,7 @@ MODULE_LICENSE("GPL");
/* /*
* Debugging stuff * Debugging stuff
*******************************************************************************/ *******************************************************************************/
#ifdef DEBUG #ifdef DEBUG
static int debuglevel = 0; static int debuglevel = 0;
...@@ -344,7 +344,7 @@ do { \ ...@@ -344,7 +344,7 @@ do { \
/* /*
* Internal functions * Internal functions
*******************************************************************************/ *******************************************************************************/
/** /**
* print start banner * print start banner
*/ */
...@@ -810,7 +810,7 @@ iucv_register_program (__u8 pgmname[16], ...@@ -810,7 +810,7 @@ iucv_register_program (__u8 pgmname[16],
sizeof (new_handler->id.userid)); sizeof (new_handler->id.userid));
EBC_TOUPPER (new_handler->id.userid, EBC_TOUPPER (new_handler->id.userid,
sizeof (new_handler->id.userid)); sizeof (new_handler->id.userid));
if (pgmmask) { if (pgmmask) {
memcpy (new_handler->id.mask, pgmmask, memcpy (new_handler->id.mask, pgmmask,
sizeof (new_handler->id.mask)); sizeof (new_handler->id.mask));
...@@ -1229,7 +1229,7 @@ iucv_purge (__u16 pathid, __u32 msgid, __u32 srccls, __u32 *audit) ...@@ -1229,7 +1229,7 @@ iucv_purge (__u16 pathid, __u32 msgid, __u32 srccls, __u32 *audit)
/* parm->ipaudit has only 3 bytes */ /* parm->ipaudit has only 3 bytes */
*audit >>= 8; *audit >>= 8;
} }
release_param(parm); release_param(parm);
iucv_debug(1, "b2f0_result = %ld", b2f0_result); iucv_debug(1, "b2f0_result = %ld", b2f0_result);
...@@ -2330,14 +2330,14 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) ...@@ -2330,14 +2330,14 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
temp_buff1[j] &= (h->id.mask)[j]; temp_buff1[j] &= (h->id.mask)[j];
temp_buff2[j] &= (h->id.mask)[j]; temp_buff2[j] &= (h->id.mask)[j];
} }
iucv_dumpit("temp_buff1:", iucv_dumpit("temp_buff1:",
temp_buff1, sizeof(temp_buff1)); temp_buff1, sizeof(temp_buff1));
iucv_dumpit("temp_buff2", iucv_dumpit("temp_buff2",
temp_buff2, sizeof(temp_buff2)); temp_buff2, sizeof(temp_buff2));
if (!memcmp (temp_buff1, temp_buff2, 24)) { if (!memcmp (temp_buff1, temp_buff2, 24)) {
iucv_debug(2, iucv_debug(2,
"found a matching handler"); "found a matching handler");
break; break;
...@@ -2368,7 +2368,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) ...@@ -2368,7 +2368,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
} else } else
iucv_sever(int_buf->ippathid, no_listener); iucv_sever(int_buf->ippathid, no_listener);
break; break;
case 0x02: /*connection complete */ case 0x02: /*connection complete */
if (messagesDisabled) { if (messagesDisabled) {
iucv_setmask(~0); iucv_setmask(~0);
...@@ -2387,7 +2387,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) ...@@ -2387,7 +2387,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
} else } else
iucv_sever(int_buf->ippathid, no_listener); iucv_sever(int_buf->ippathid, no_listener);
break; break;
case 0x03: /* connection severed */ case 0x03: /* connection severed */
if (messagesDisabled) { if (messagesDisabled) {
iucv_setmask(~0); iucv_setmask(~0);
...@@ -2398,13 +2398,13 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) ...@@ -2398,13 +2398,13 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
interrupt->ConnectionSevered( interrupt->ConnectionSevered(
(iucv_ConnectionSevered *)int_buf, (iucv_ConnectionSevered *)int_buf,
h->pgm_data); h->pgm_data);
else else
iucv_sever (int_buf->ippathid, no_listener); iucv_sever (int_buf->ippathid, no_listener);
} else } else
iucv_sever(int_buf->ippathid, no_listener); iucv_sever(int_buf->ippathid, no_listener);
break; break;
case 0x04: /* connection quiesced */ case 0x04: /* connection quiesced */
if (messagesDisabled) { if (messagesDisabled) {
iucv_setmask(~0); iucv_setmask(~0);
...@@ -2420,7 +2420,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) ...@@ -2420,7 +2420,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"ConnectionQuiesced not called"); "ConnectionQuiesced not called");
} }
break; break;
case 0x05: /* connection resumed */ case 0x05: /* connection resumed */
if (messagesDisabled) { if (messagesDisabled) {
iucv_setmask(~0); iucv_setmask(~0);
...@@ -2436,7 +2436,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) ...@@ -2436,7 +2436,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"ConnectionResumed not called"); "ConnectionResumed not called");
} }
break; break;
case 0x06: /* priority message complete */ case 0x06: /* priority message complete */
case 0x07: /* nonpriority message complete */ case 0x07: /* nonpriority message complete */
if (h) { if (h) {
...@@ -2449,7 +2449,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) ...@@ -2449,7 +2449,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
"MessageComplete not called"); "MessageComplete not called");
} }
break; break;
case 0x08: /* priority message pending */ case 0x08: /* priority message pending */
case 0x09: /* nonpriority message pending */ case 0x09: /* nonpriority message pending */
if (h) { if (h) {
...@@ -2467,7 +2467,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf) ...@@ -2467,7 +2467,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
__FUNCTION__); __FUNCTION__);
break; break;
} /* end switch */ } /* end switch */
iucv_debug(2, "exiting pathid %d, type %02X", iucv_debug(2, "exiting pathid %d, type %02X",
int_buf->ippathid, int_buf->iptype); int_buf->ippathid, int_buf->iptype);
......
此差异已折叠。
...@@ -68,6 +68,7 @@ static void lcs_tasklet(unsigned long); ...@@ -68,6 +68,7 @@ static void lcs_tasklet(unsigned long);
static void lcs_start_kernel_thread(struct lcs_card *card); static void lcs_start_kernel_thread(struct lcs_card *card);
static void lcs_get_frames_cb(struct lcs_channel *, struct lcs_buffer *); static void lcs_get_frames_cb(struct lcs_channel *, struct lcs_buffer *);
static int lcs_send_delipm(struct lcs_card *, struct lcs_ipm_list *); static int lcs_send_delipm(struct lcs_card *, struct lcs_ipm_list *);
static int lcs_recovery(void *ptr);
/** /**
* Debug Facility Stuff * Debug Facility Stuff
...@@ -429,12 +430,6 @@ lcs_setup_card(struct lcs_card *card) ...@@ -429,12 +430,6 @@ lcs_setup_card(struct lcs_card *card)
card->tx_buffer = NULL; card->tx_buffer = NULL;
card->tx_emitted = 0; card->tx_emitted = 0;
/* Initialize kernel thread task used for LGW commands. */
INIT_WORK(&card->kernel_thread_starter,
(void *)lcs_start_kernel_thread,card);
card->thread_start_mask = 0;
card->thread_allowed_mask = 0;
card->thread_running_mask = 0;
init_waitqueue_head(&card->wait_q); init_waitqueue_head(&card->wait_q);
spin_lock_init(&card->lock); spin_lock_init(&card->lock);
spin_lock_init(&card->ipm_lock); spin_lock_init(&card->ipm_lock);
...@@ -675,8 +670,9 @@ lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) ...@@ -675,8 +670,9 @@ lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
int index, rc; int index, rc;
LCS_DBF_TEXT(5, trace, "rdybuff"); LCS_DBF_TEXT(5, trace, "rdybuff");
BUG_ON(buffer->state != BUF_STATE_LOCKED && if (buffer->state != BUF_STATE_LOCKED &&
buffer->state != BUF_STATE_PROCESSED); buffer->state != BUF_STATE_PROCESSED)
BUG();
spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
buffer->state = BUF_STATE_READY; buffer->state = BUF_STATE_READY;
index = buffer - channel->iob; index = buffer - channel->iob;
...@@ -700,7 +696,8 @@ __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) ...@@ -700,7 +696,8 @@ __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
int index, prev, next; int index, prev, next;
LCS_DBF_TEXT(5, trace, "prcsbuff"); LCS_DBF_TEXT(5, trace, "prcsbuff");
BUG_ON(buffer->state != BUF_STATE_READY); if (buffer->state != BUF_STATE_READY)
BUG();
buffer->state = BUF_STATE_PROCESSED; buffer->state = BUF_STATE_PROCESSED;
index = buffer - channel->iob; index = buffer - channel->iob;
prev = (index - 1) & (LCS_NUM_BUFFS - 1); prev = (index - 1) & (LCS_NUM_BUFFS - 1);
...@@ -732,8 +729,9 @@ lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer) ...@@ -732,8 +729,9 @@ lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
unsigned long flags; unsigned long flags;
LCS_DBF_TEXT(5, trace, "relbuff"); LCS_DBF_TEXT(5, trace, "relbuff");
BUG_ON(buffer->state != BUF_STATE_LOCKED && if (buffer->state != BUF_STATE_LOCKED &&
buffer->state != BUF_STATE_PROCESSED); buffer->state != BUF_STATE_PROCESSED)
BUG();
spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags); spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
buffer->state = BUF_STATE_EMPTY; buffer->state = BUF_STATE_EMPTY;
spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags); spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
...@@ -1147,8 +1145,6 @@ lcs_fix_multicast_list(struct lcs_card *card) ...@@ -1147,8 +1145,6 @@ lcs_fix_multicast_list(struct lcs_card *card)
list_add_tail(&ipm->list, &card->ipm_list); list_add_tail(&ipm->list, &card->ipm_list);
} }
spin_unlock_irqrestore(&card->ipm_lock, flags); spin_unlock_irqrestore(&card->ipm_lock, flags);
if (card->state == DEV_STATE_UP)
netif_wake_queue(card->dev);
} }
/** /**
...@@ -1231,17 +1227,17 @@ lcs_set_mc_addresses(struct lcs_card *card, struct in_device *in4_dev) ...@@ -1231,17 +1227,17 @@ lcs_set_mc_addresses(struct lcs_card *card, struct in_device *in4_dev)
if (ipm != NULL) if (ipm != NULL)
continue; /* Address already in list. */ continue; /* Address already in list. */
ipm = (struct lcs_ipm_list *) ipm = (struct lcs_ipm_list *)
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) ...@@ -1269,7 +1265,15 @@ lcs_register_mc_addresses(void *data)
read_unlock(&in4_dev->mc_list_lock); read_unlock(&in4_dev->mc_list_lock);
in_dev_put(in4_dev); in_dev_put(in4_dev);
netif_carrier_off(card->dev);
netif_tx_disable(card->dev);
wait_event(card->write.wait_q,
(card->write.state != CH_STATE_RUNNING));
lcs_fix_multicast_list(card); lcs_fix_multicast_list(card);
if (card->state == DEV_STATE_UP) {
netif_carrier_on(card->dev);
netif_wake_queue(card->dev);
}
out: out:
lcs_clear_thread_running_bit(card, LCS_SET_MC_THREAD); lcs_clear_thread_running_bit(card, LCS_SET_MC_THREAD);
return 0; return 0;
...@@ -1286,7 +1290,7 @@ lcs_set_multicast_list(struct net_device *dev) ...@@ -1286,7 +1290,7 @@ lcs_set_multicast_list(struct net_device *dev)
LCS_DBF_TEXT(4, trace, "setmulti"); LCS_DBF_TEXT(4, trace, "setmulti");
card = (struct lcs_card *) dev->priv; card = (struct lcs_card *) dev->priv;
if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD)) if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD))
schedule_work(&card->kernel_thread_starter); schedule_work(&card->kernel_thread_starter);
} }
...@@ -1318,6 +1322,53 @@ lcs_check_irb_error(struct ccw_device *cdev, struct irb *irb) ...@@ -1318,6 +1322,53 @@ lcs_check_irb_error(struct ccw_device *cdev, struct irb *irb)
return PTR_ERR(irb); return PTR_ERR(irb);
} }
static int
lcs_get_problem(struct ccw_device *cdev, struct irb *irb)
{
int dstat, cstat;
char *sense;
sense = (char *) irb->ecw;
cstat = irb->scsw.cstat;
dstat = irb->scsw.dstat;
if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK |
SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK |
SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {
LCS_DBF_TEXT(2, trace, "CGENCHK");
return 1;
}
if (dstat & DEV_STAT_UNIT_CHECK) {
if (sense[LCS_SENSE_BYTE_1] &
LCS_SENSE_RESETTING_EVENT) {
LCS_DBF_TEXT(2, trace, "REVIND");
return 1;
}
if (sense[LCS_SENSE_BYTE_0] &
LCS_SENSE_CMD_REJECT) {
LCS_DBF_TEXT(2, trace, "CMDREJ");
return 0;
}
if ((!sense[LCS_SENSE_BYTE_0]) &&
(!sense[LCS_SENSE_BYTE_1]) &&
(!sense[LCS_SENSE_BYTE_2]) &&
(!sense[LCS_SENSE_BYTE_3])) {
LCS_DBF_TEXT(2, trace, "ZEROSEN");
return 0;
}
LCS_DBF_TEXT(2, trace, "DGENCHK");
return 1;
}
return 0;
}
void
lcs_schedule_recovery(struct lcs_card *card)
{
LCS_DBF_TEXT(2, trace, "startrec");
if (!lcs_set_thread_start_bit(card, LCS_RECOVERY_THREAD))
schedule_work(&card->kernel_thread_starter);
}
/** /**
* IRQ Handler for LCS channels * IRQ Handler for LCS channels
...@@ -1327,7 +1378,8 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) ...@@ -1327,7 +1378,8 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
{ {
struct lcs_card *card; struct lcs_card *card;
struct lcs_channel *channel; struct lcs_channel *channel;
int index; int rc, index;
int cstat, dstat;
if (lcs_check_irb_error(cdev, irb)) if (lcs_check_irb_error(cdev, irb))
return; return;
...@@ -1338,14 +1390,27 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) ...@@ -1338,14 +1390,27 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
else else
channel = &card->write; channel = &card->write;
cstat = irb->scsw.cstat;
dstat = irb->scsw.dstat;
LCS_DBF_TEXT_(5, trace, "Rint%s",cdev->dev.bus_id); LCS_DBF_TEXT_(5, trace, "Rint%s",cdev->dev.bus_id);
LCS_DBF_TEXT_(5, trace, "%4x%4x",irb->scsw.cstat, irb->scsw.dstat); LCS_DBF_TEXT_(5, trace, "%4x%4x",irb->scsw.cstat, irb->scsw.dstat);
LCS_DBF_TEXT_(5, trace, "%4x%4x",irb->scsw.fctl, irb->scsw.actl); LCS_DBF_TEXT_(5, trace, "%4x%4x",irb->scsw.fctl, irb->scsw.actl);
/* Check for channel and device errors presented */
rc = lcs_get_problem(cdev, irb);
if (rc || (dstat & DEV_STAT_UNIT_EXCEP)) {
PRINT_WARN("check on device %s, dstat=0x%X, cstat=0x%X \n",
cdev->dev.bus_id, dstat, cstat);
if (rc) {
lcs_schedule_recovery(card);
wake_up(&card->wait_q);
return;
}
}
/* How far in the ccw chain have we processed? */ /* How far in the ccw chain have we processed? */
if ((channel->state != CH_STATE_INIT) && if ((channel->state != CH_STATE_INIT) &&
(irb->scsw.fctl & SCSW_FCTL_START_FUNC)) { (irb->scsw.fctl & SCSW_FCTL_START_FUNC)) {
index = (struct ccw1 *) __va((addr_t) irb->scsw.cpa) index = (struct ccw1 *) __va((addr_t) irb->scsw.cpa)
- channel->ccws; - channel->ccws;
if ((irb->scsw.actl & SCSW_ACTL_SUSPENDED) || if ((irb->scsw.actl & SCSW_ACTL_SUSPENDED) ||
(irb->scsw.cstat & SCHN_STAT_PCI)) (irb->scsw.cstat & SCHN_STAT_PCI))
...@@ -1367,7 +1432,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) ...@@ -1367,7 +1432,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
else if (irb->scsw.actl & SCSW_ACTL_SUSPENDED) else if (irb->scsw.actl & SCSW_ACTL_SUSPENDED)
/* CCW execution stopped on a suspend bit. */ /* CCW execution stopped on a suspend bit. */
channel->state = CH_STATE_SUSPENDED; channel->state = CH_STATE_SUSPENDED;
if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC) { if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC) {
if (irb->scsw.cc != 0) { if (irb->scsw.cc != 0) {
ccw_device_halt(channel->ccwdev, (addr_t) channel); ccw_device_halt(channel->ccwdev, (addr_t) channel);
...@@ -1376,7 +1440,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb) ...@@ -1376,7 +1440,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
/* The channel has been stopped by halt_IO. */ /* The channel has been stopped by halt_IO. */
channel->state = CH_STATE_HALTED; channel->state = CH_STATE_HALTED;
} }
if (irb->scsw.fctl & SCSW_FCTL_CLEAR_FUNC) { if (irb->scsw.fctl & SCSW_FCTL_CLEAR_FUNC) {
channel->state = CH_STATE_CLEARED; channel->state = CH_STATE_CLEARED;
} }
...@@ -1452,7 +1515,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer) ...@@ -1452,7 +1515,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
lcs_release_buffer(channel, buffer); lcs_release_buffer(channel, buffer);
card = (struct lcs_card *) card = (struct lcs_card *)
((char *) channel - offsetof(struct lcs_card, write)); ((char *) channel - offsetof(struct lcs_card, write));
if (netif_queue_stopped(card->dev)) if (netif_queue_stopped(card->dev) && netif_carrier_ok(card->dev))
netif_wake_queue(card->dev); netif_wake_queue(card->dev);
spin_lock(&card->lock); spin_lock(&card->lock);
card->tx_emitted--; card->tx_emitted--;
...@@ -1488,6 +1551,10 @@ __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb, ...@@ -1488,6 +1551,10 @@ __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb,
card->stats.tx_carrier_errors++; card->stats.tx_carrier_errors++;
return 0; return 0;
} }
if (skb->protocol == htons(ETH_P_IPV6)) {
dev_kfree_skb(skb);
return 0;
}
netif_stop_queue(card->dev); netif_stop_queue(card->dev);
spin_lock(&card->lock); spin_lock(&card->lock);
if (card->tx_buffer != NULL && if (card->tx_buffer != NULL &&
...@@ -1632,30 +1699,6 @@ lcs_detect(struct lcs_card *card) ...@@ -1632,30 +1699,6 @@ lcs_detect(struct lcs_card *card)
return rc; return rc;
} }
/**
* reset card
*/
static int
lcs_resetcard(struct lcs_card *card)
{
int retries;
LCS_DBF_TEXT(2, trace, "rescard");
for (retries = 0; retries < 10; retries++) {
if (lcs_detect(card) == 0) {
netif_wake_queue(card->dev);
card->state = DEV_STATE_UP;
PRINT_INFO("LCS device %s successfully restarted!\n",
card->dev->name);
return 0;
}
msleep(3000);
}
PRINT_ERR("Error in Reseting LCS card!\n");
return -EIO;
}
/** /**
* LCS Stop card * LCS Stop card
*/ */
...@@ -1679,111 +1722,6 @@ lcs_stopcard(struct lcs_card *card) ...@@ -1679,111 +1722,6 @@ lcs_stopcard(struct lcs_card *card)
return rc; return rc;
} }
/**
* LGW initiated commands
*/
static int
lcs_lgw_startlan_thread(void *data)
{
struct lcs_card *card;
card = (struct lcs_card *) data;
daemonize("lgwstpln");
if (!lcs_do_run_thread(card, LCS_STARTLAN_THREAD))
return 0;
LCS_DBF_TEXT(4, trace, "lgwstpln");
if (card->dev)
netif_stop_queue(card->dev);
if (lcs_startlan(card) == 0) {
netif_wake_queue(card->dev);
card->state = DEV_STATE_UP;
PRINT_INFO("LCS Startlan for device %s succeeded!\n",
card->dev->name);
} else
PRINT_ERR("LCS Startlan for device %s failed!\n",
card->dev->name);
lcs_clear_thread_running_bit(card, LCS_STARTLAN_THREAD);
return 0;
}
/**
* Send startup command initiated by Lan Gateway
*/
static int
lcs_lgw_startup_thread(void *data)
{
int rc;
struct lcs_card *card;
card = (struct lcs_card *) data;
daemonize("lgwstaln");
if (!lcs_do_run_thread(card, LCS_STARTUP_THREAD))
return 0;
LCS_DBF_TEXT(4, trace, "lgwstaln");
if (card->dev)
netif_stop_queue(card->dev);
rc = lcs_send_startup(card, LCS_INITIATOR_LGW);
if (rc != 0) {
PRINT_ERR("Startup for LCS device %s initiated " \
"by LGW failed!\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 ...@@ -1791,15 +1729,12 @@ static void
lcs_start_kernel_thread(struct lcs_card *card) lcs_start_kernel_thread(struct lcs_card *card)
{ {
LCS_DBF_TEXT(5, trace, "krnthrd"); LCS_DBF_TEXT(5, trace, "krnthrd");
if (lcs_do_start_thread(card, LCS_STARTUP_THREAD)) if (lcs_do_start_thread(card, LCS_RECOVERY_THREAD))
kernel_thread(lcs_lgw_startup_thread, (void *) card, SIGCHLD); kernel_thread(lcs_recovery, (void *) card, SIGCHLD);
if (lcs_do_start_thread(card, LCS_STARTLAN_THREAD))
kernel_thread(lcs_lgw_startlan_thread, (void *) card, SIGCHLD);
if (lcs_do_start_thread(card, LCS_STOPLAN_THREAD))
kernel_thread(lcs_lgw_stoplan_thread, (void *) card, SIGCHLD);
#ifdef CONFIG_IP_MULTICAST #ifdef CONFIG_IP_MULTICAST
if (lcs_do_start_thread(card, LCS_SET_MC_THREAD)) if (lcs_do_start_thread(card, LCS_SET_MC_THREAD))
kernel_thread(lcs_register_mc_addresses, (void *) card, SIGCHLD); kernel_thread(lcs_register_mc_addresses,
(void *) card, SIGCHLD);
#endif #endif
} }
...@@ -1813,19 +1748,14 @@ lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd) ...@@ -1813,19 +1748,14 @@ lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd)
if (cmd->initiator == LCS_INITIATOR_LGW) { if (cmd->initiator == LCS_INITIATOR_LGW) {
switch(cmd->cmd_code) { switch(cmd->cmd_code) {
case LCS_CMD_STARTUP: case LCS_CMD_STARTUP:
if (!lcs_set_thread_start_bit(card,
LCS_STARTUP_THREAD))
schedule_work(&card->kernel_thread_starter);
break;
case LCS_CMD_STARTLAN: case LCS_CMD_STARTLAN:
if (!lcs_set_thread_start_bit(card, lcs_schedule_recovery(card);
LCS_STARTLAN_THREAD))
schedule_work(&card->kernel_thread_starter);
break; break;
case LCS_CMD_STOPLAN: case LCS_CMD_STOPLAN:
if (!lcs_set_thread_start_bit(card, PRINT_WARN("Stoplan for %s initiated by LGW.\n",
LCS_STOPLAN_THREAD)) card->dev->name);
schedule_work(&card->kernel_thread_starter); if (card->dev)
netif_carrier_off(card->dev);
break; break;
default: default:
PRINT_INFO("UNRECOGNIZED LGW COMMAND\n"); PRINT_INFO("UNRECOGNIZED LGW COMMAND\n");
...@@ -1941,8 +1871,11 @@ lcs_stop_device(struct net_device *dev) ...@@ -1941,8 +1871,11 @@ lcs_stop_device(struct net_device *dev)
LCS_DBF_TEXT(2, trace, "stopdev"); LCS_DBF_TEXT(2, trace, "stopdev");
card = (struct lcs_card *) dev->priv; card = (struct lcs_card *) dev->priv;
netif_stop_queue(dev); netif_carrier_off(dev);
netif_tx_disable(dev);
dev->flags &= ~IFF_UP; dev->flags &= ~IFF_UP;
wait_event(card->write.wait_q,
(card->write.state != CH_STATE_RUNNING));
rc = lcs_stopcard(card); rc = lcs_stopcard(card);
if (rc) if (rc)
PRINT_ERR("Try it again!\n "); PRINT_ERR("Try it again!\n ");
...@@ -1968,6 +1901,7 @@ lcs_open_device(struct net_device *dev) ...@@ -1968,6 +1901,7 @@ lcs_open_device(struct net_device *dev)
} else { } else {
dev->flags |= IFF_UP; dev->flags |= IFF_UP;
netif_carrier_on(dev);
netif_wake_queue(dev); netif_wake_queue(dev);
card->state = DEV_STATE_UP; card->state = DEV_STATE_UP;
} }
...@@ -2059,10 +1993,31 @@ lcs_timeout_store (struct device *dev, struct device_attribute *attr, const char ...@@ -2059,10 +1993,31 @@ lcs_timeout_store (struct device *dev, struct device_attribute *attr, const char
DEVICE_ATTR(lancmd_timeout, 0644, lcs_timeout_show, lcs_timeout_store); DEVICE_ATTR(lancmd_timeout, 0644, lcs_timeout_show, lcs_timeout_store);
static ssize_t
lcs_dev_recover_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct lcs_card *card = dev->driver_data;
char *tmp;
int i;
if (!card)
return -EINVAL;
if (card->state != DEV_STATE_UP)
return -EPERM;
i = simple_strtoul(buf, &tmp, 16);
if (i == 1)
lcs_schedule_recovery(card);
return count;
}
static DEVICE_ATTR(recover, 0200, NULL, lcs_dev_recover_store);
static struct attribute * lcs_attrs[] = { static struct attribute * lcs_attrs[] = {
&dev_attr_portno.attr, &dev_attr_portno.attr,
&dev_attr_type.attr, &dev_attr_type.attr,
&dev_attr_lancmd_timeout.attr, &dev_attr_lancmd_timeout.attr,
&dev_attr_recover.attr,
NULL, NULL,
}; };
...@@ -2099,6 +2054,12 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev) ...@@ -2099,6 +2054,12 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev)
ccwgdev->dev.driver_data = card; ccwgdev->dev.driver_data = card;
ccwgdev->cdev[0]->handler = lcs_irq; ccwgdev->cdev[0]->handler = lcs_irq;
ccwgdev->cdev[1]->handler = lcs_irq; ccwgdev->cdev[1]->handler = lcs_irq;
card->gdev = ccwgdev;
INIT_WORK(&card->kernel_thread_starter,
(void *) lcs_start_kernel_thread, card);
card->thread_start_mask = 0;
card->thread_allowed_mask = 0;
card->thread_running_mask = 0;
return 0; return 0;
} }
...@@ -2200,6 +2161,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev) ...@@ -2200,6 +2161,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
if (recover_state == DEV_STATE_RECOVER) { if (recover_state == DEV_STATE_RECOVER) {
lcs_set_multicast_list(card->dev); lcs_set_multicast_list(card->dev);
card->dev->flags |= IFF_UP; card->dev->flags |= IFF_UP;
netif_carrier_on(card->dev);
netif_wake_queue(card->dev); netif_wake_queue(card->dev);
card->state = DEV_STATE_UP; card->state = DEV_STATE_UP;
} else { } else {
...@@ -2229,7 +2191,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev) ...@@ -2229,7 +2191,7 @@ lcs_new_device(struct ccwgroup_device *ccwgdev)
* lcs_shutdown_device, called when setting the group device offline. * lcs_shutdown_device, called when setting the group device offline.
*/ */
static int static int
lcs_shutdown_device(struct ccwgroup_device *ccwgdev) __lcs_shutdown_device(struct ccwgroup_device *ccwgdev, int recovery_mode)
{ {
struct lcs_card *card; struct lcs_card *card;
enum lcs_dev_states recover_state; enum lcs_dev_states recover_state;
...@@ -2239,9 +2201,11 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev) ...@@ -2239,9 +2201,11 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
card = (struct lcs_card *)ccwgdev->dev.driver_data; card = (struct lcs_card *)ccwgdev->dev.driver_data;
if (!card) if (!card)
return -ENODEV; return -ENODEV;
lcs_set_allowed_threads(card, 0); if (recovery_mode == 0) {
if (lcs_wait_for_threads(card, LCS_SET_MC_THREAD)) lcs_set_allowed_threads(card, 0);
return -ERESTARTSYS; if (lcs_wait_for_threads(card, LCS_SET_MC_THREAD))
return -ERESTARTSYS;
}
LCS_DBF_HEX(3, setup, &card, sizeof(void*)); LCS_DBF_HEX(3, setup, &card, sizeof(void*));
recover_state = card->state; recover_state = card->state;
...@@ -2256,6 +2220,43 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev) ...@@ -2256,6 +2220,43 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
return 0; return 0;
} }
static int
lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
{
return __lcs_shutdown_device(ccwgdev, 0);
}
/**
* drive lcs recovery after startup and startlan initiated by Lan Gateway
*/
static int
lcs_recovery(void *ptr)
{
struct lcs_card *card;
struct ccwgroup_device *gdev;
int rc;
card = (struct lcs_card *) ptr;
daemonize("lcs_recover");
LCS_DBF_TEXT(4, trace, "recover1");
if (!lcs_do_run_thread(card, LCS_RECOVERY_THREAD))
return 0;
LCS_DBF_TEXT(4, trace, "recover2");
gdev = card->gdev;
PRINT_WARN("Recovery of device %s started...\n", gdev->dev.bus_id);
rc = __lcs_shutdown_device(gdev, 1);
rc = lcs_new_device(gdev);
if (!rc)
PRINT_INFO("Device %s successfully recovered!\n",
card->dev->name);
else
PRINT_INFO("Device %s could not be recovered!\n",
card->dev->name);
lcs_clear_thread_running_bit(card, LCS_RECOVERY_THREAD);
return 0;
}
/** /**
* lcs_remove_device, free buffers and card * lcs_remove_device, free buffers and card
*/ */
......
...@@ -73,13 +73,17 @@ do { \ ...@@ -73,13 +73,17 @@ do { \
/** /**
* LCS sense byte definitions * LCS sense byte definitions
*/ */
#define LCS_SENSE_BYTE_0 0
#define LCS_SENSE_BYTE_1 1
#define LCS_SENSE_BYTE_2 2
#define LCS_SENSE_BYTE_3 3
#define LCS_SENSE_INTERFACE_DISCONNECT 0x01 #define LCS_SENSE_INTERFACE_DISCONNECT 0x01
#define LCS_SENSE_EQUIPMENT_CHECK 0x10 #define LCS_SENSE_EQUIPMENT_CHECK 0x10
#define LCS_SENSE_BUS_OUT_CHECK 0x20 #define LCS_SENSE_BUS_OUT_CHECK 0x20
#define LCS_SENSE_INTERVENTION_REQUIRED 0x40 #define LCS_SENSE_INTERVENTION_REQUIRED 0x40
#define LCS_SENSE_CMD_REJECT 0x80 #define LCS_SENSE_CMD_REJECT 0x80
#define LCS_SENSE_RESETTING_EVENT 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 { ...@@ -152,10 +156,9 @@ enum lcs_dev_states {
enum lcs_threads { enum lcs_threads {
LCS_SET_MC_THREAD = 1, LCS_SET_MC_THREAD = 1,
LCS_STARTLAN_THREAD = 2, LCS_RECOVERY_THREAD = 2,
LCS_STOPLAN_THREAD = 4,
LCS_STARTUP_THREAD = 8,
}; };
/** /**
* LCS struct declarations * LCS struct declarations
*/ */
...@@ -286,6 +289,7 @@ struct lcs_card { ...@@ -286,6 +289,7 @@ struct lcs_card {
struct net_device_stats stats; struct net_device_stats stats;
unsigned short (*lan_type_trans)(struct sk_buff *skb, unsigned short (*lan_type_trans)(struct sk_buff *skb,
struct net_device *dev); struct net_device *dev);
struct ccwgroup_device *gdev;
struct lcs_channel read; struct lcs_channel read;
struct lcs_channel write; struct lcs_channel write;
struct lcs_buffer *tx_buffer; struct lcs_buffer *tx_buffer;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *
*/ */
#undef DEBUG #undef DEBUG
#include <linux/module.h> #include <linux/module.h>
...@@ -65,7 +65,7 @@ MODULE_AUTHOR ...@@ -65,7 +65,7 @@ MODULE_AUTHOR
("(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)"); ("(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)");
MODULE_DESCRIPTION ("Linux for S/390 IUCV network driver"); MODULE_DESCRIPTION ("Linux for S/390 IUCV network driver");
#define PRINTK_HEADER " iucv: " /* for debugging */ #define PRINTK_HEADER " iucv: " /* for debugging */
static struct device_driver netiucv_driver = { static struct device_driver netiucv_driver = {
...@@ -202,7 +202,7 @@ netiucv_printname(char *name) ...@@ -202,7 +202,7 @@ netiucv_printname(char *name)
*p = '\0'; *p = '\0';
return tmp; return tmp;
} }
/** /**
* States of the interface statemachine. * States of the interface statemachine.
*/ */
...@@ -244,7 +244,7 @@ static const char *dev_event_names[] = { ...@@ -244,7 +244,7 @@ static const char *dev_event_names[] = {
"Connection up", "Connection up",
"Connection down", "Connection down",
}; };
/** /**
* Events of the connection statemachine * Events of the connection statemachine
*/ */
...@@ -364,7 +364,7 @@ static const char *conn_state_names[] = { ...@@ -364,7 +364,7 @@ static const char *conn_state_names[] = {
"Connect error", "Connect error",
}; };
/** /**
* Debug Facility Stuff * Debug Facility Stuff
*/ */
...@@ -516,7 +516,7 @@ static void ...@@ -516,7 +516,7 @@ static void
fsm_action_nop(fsm_instance *fi, int event, void *arg) fsm_action_nop(fsm_instance *fi, int event, void *arg)
{ {
} }
/** /**
* Actions of the connection statemachine * Actions of the connection statemachine
*****************************************************************************/ *****************************************************************************/
...@@ -993,7 +993,7 @@ static const fsm_node conn_fsm[] = { ...@@ -993,7 +993,7 @@ static const fsm_node conn_fsm[] = {
static const int CONN_FSM_LEN = sizeof(conn_fsm) / sizeof(fsm_node); static const int CONN_FSM_LEN = sizeof(conn_fsm) / sizeof(fsm_node);
/** /**
* Actions for interface - statemachine. * Actions for interface - statemachine.
*****************************************************************************/ *****************************************************************************/
...@@ -1182,7 +1182,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) { ...@@ -1182,7 +1182,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
fsm_newstate(conn->fsm, CONN_STATE_TX); fsm_newstate(conn->fsm, CONN_STATE_TX);
conn->prof.send_stamp = xtime; conn->prof.send_stamp = xtime;
rc = iucv_send(conn->pathid, NULL, 0, 0, 1 /* single_flag */, rc = iucv_send(conn->pathid, NULL, 0, 0, 1 /* single_flag */,
0, nskb->data, nskb->len); 0, nskb->data, nskb->len);
/* Shut up, gcc! nskb is always below 2G. */ /* Shut up, gcc! nskb is always below 2G. */
...@@ -1220,7 +1220,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) { ...@@ -1220,7 +1220,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
return rc; return rc;
} }
/** /**
* Interface API for upper network layers * Interface API for upper network layers
*****************************************************************************/ *****************************************************************************/
...@@ -1291,7 +1291,7 @@ static int netiucv_tx(struct sk_buff *skb, struct net_device *dev) ...@@ -1291,7 +1291,7 @@ static int netiucv_tx(struct sk_buff *skb, struct net_device *dev)
/** /**
* If connection is not running, try to restart it * If connection is not running, try to restart it
* and throw away packet. * and throw away packet.
*/ */
if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) { if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) {
fsm_event(privptr->fsm, DEV_EVENT_START, dev); fsm_event(privptr->fsm, DEV_EVENT_START, dev);
...@@ -1538,7 +1538,7 @@ static ssize_t ...@@ -1538,7 +1538,7 @@ static ssize_t
maxcq_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) maxcq_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{ {
struct netiucv_priv *priv = dev->driver_data; struct netiucv_priv *priv = dev->driver_data;
IUCV_DBF_TEXT(trace, 4, __FUNCTION__); IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
priv->conn->prof.maxcqueue = 0; priv->conn->prof.maxcqueue = 0;
return count; return count;
...@@ -1559,7 +1559,7 @@ static ssize_t ...@@ -1559,7 +1559,7 @@ static ssize_t
sdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) sdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{ {
struct netiucv_priv *priv = dev->driver_data; struct netiucv_priv *priv = dev->driver_data;
IUCV_DBF_TEXT(trace, 4, __FUNCTION__); IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
priv->conn->prof.doios_single = 0; priv->conn->prof.doios_single = 0;
return count; return count;
...@@ -1580,7 +1580,7 @@ static ssize_t ...@@ -1580,7 +1580,7 @@ static ssize_t
mdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) mdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{ {
struct netiucv_priv *priv = dev->driver_data; struct netiucv_priv *priv = dev->driver_data;
IUCV_DBF_TEXT(trace, 5, __FUNCTION__); IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
priv->conn->prof.doios_multi = 0; priv->conn->prof.doios_multi = 0;
return count; return count;
...@@ -1601,7 +1601,7 @@ static ssize_t ...@@ -1601,7 +1601,7 @@ static ssize_t
txlen_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) txlen_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{ {
struct netiucv_priv *priv = dev->driver_data; struct netiucv_priv *priv = dev->driver_data;
IUCV_DBF_TEXT(trace, 4, __FUNCTION__); IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
priv->conn->prof.txlen = 0; priv->conn->prof.txlen = 0;
return count; return count;
...@@ -1622,7 +1622,7 @@ static ssize_t ...@@ -1622,7 +1622,7 @@ static ssize_t
txtime_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) txtime_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{ {
struct netiucv_priv *priv = dev->driver_data; struct netiucv_priv *priv = dev->driver_data;
IUCV_DBF_TEXT(trace, 4, __FUNCTION__); IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
priv->conn->prof.tx_time = 0; priv->conn->prof.tx_time = 0;
return count; return count;
...@@ -2000,7 +2000,7 @@ conn_write(struct device_driver *drv, const char *buf, size_t count) ...@@ -2000,7 +2000,7 @@ conn_write(struct device_driver *drv, const char *buf, size_t count)
} }
PRINT_INFO("%s: '%s'\n", dev->name, netiucv_printname(username)); PRINT_INFO("%s: '%s'\n", dev->name, netiucv_printname(username));
return count; return count;
out_free_ndev: out_free_ndev:
...@@ -2099,7 +2099,7 @@ static int __init ...@@ -2099,7 +2099,7 @@ static int __init
netiucv_init(void) netiucv_init(void)
{ {
int ret; int ret;
ret = iucv_register_dbf_views(); ret = iucv_register_dbf_views();
if (ret) { if (ret) {
PRINT_WARN("netiucv_init failed, " PRINT_WARN("netiucv_init failed, "
...@@ -2128,7 +2128,7 @@ netiucv_init(void) ...@@ -2128,7 +2128,7 @@ netiucv_init(void)
} }
return ret; return ret;
} }
module_init(netiucv_init); module_init(netiucv_init);
module_exit(netiucv_exit); module_exit(netiucv_exit);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -376,7 +376,7 @@ struct qeth_hdr_osn { ...@@ -376,7 +376,7 @@ struct qeth_hdr_osn {
__u8 reserved3[18]; __u8 reserved3[18];
__u32 ccid; __u32 ccid;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct qeth_hdr { struct qeth_hdr {
union { union {
struct qeth_hdr_layer2 l2; struct qeth_hdr_layer2 l2;
...@@ -825,7 +825,7 @@ struct qeth_card { ...@@ -825,7 +825,7 @@ struct qeth_card {
int use_hard_stop; int use_hard_stop;
int (*orig_hard_header)(struct sk_buff *,struct net_device *, int (*orig_hard_header)(struct sk_buff *,struct net_device *,
unsigned short,void *,void *,unsigned); unsigned short,void *,void *,unsigned);
struct qeth_osn_info osn_info; struct qeth_osn_info osn_info;
}; };
struct qeth_card_list_struct { struct qeth_card_list_struct {
...@@ -944,7 +944,7 @@ qeth_get_netdev_flags(struct qeth_card *card) ...@@ -944,7 +944,7 @@ qeth_get_netdev_flags(struct qeth_card *card)
return 0; return 0;
switch (card->info.type) { switch (card->info.type) {
case QETH_CARD_TYPE_IQD: case QETH_CARD_TYPE_IQD:
case QETH_CARD_TYPE_OSN: case QETH_CARD_TYPE_OSN:
return IFF_NOARP; return IFF_NOARP;
#ifdef CONFIG_QETH_IPV6 #ifdef CONFIG_QETH_IPV6
default: default:
...@@ -981,7 +981,7 @@ static inline int ...@@ -981,7 +981,7 @@ static inline int
qeth_get_max_mtu_for_card(int cardtype) qeth_get_max_mtu_for_card(int cardtype)
{ {
switch (cardtype) { switch (cardtype) {
case QETH_CARD_TYPE_UNKNOWN: case QETH_CARD_TYPE_UNKNOWN:
case QETH_CARD_TYPE_OSAE: case QETH_CARD_TYPE_OSAE:
case QETH_CARD_TYPE_OSN: case QETH_CARD_TYPE_OSN:
...@@ -1097,9 +1097,9 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr) ...@@ -1097,9 +1097,9 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr)
int count = 0, rc = 0; int count = 0, rc = 0;
int in[4]; int in[4];
rc = sscanf(buf, "%d.%d.%d.%d%n", rc = sscanf(buf, "%d.%d.%d.%d%n",
&in[0], &in[1], &in[2], &in[3], &count); &in[0], &in[1], &in[2], &in[3], &count);
if (rc != 4 || count) if (rc != 4 || count<=0)
return -EINVAL; return -EINVAL;
for (count = 0; count < 4; count++) { for (count = 0; count < 4; count++) {
if (in[count] > 255) if (in[count] > 255)
...@@ -1131,7 +1131,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr) ...@@ -1131,7 +1131,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
cnt = out = found = save_cnt = num2 = 0; cnt = out = found = save_cnt = num2 = 0;
end = start = (char *) buf; end = start = (char *) buf;
in = (__u16 *) addr; in = (__u16 *) addr;
memset(in, 0, 16); memset(in, 0, 16);
while (end) { while (end) {
end = strchr(end,':'); end = strchr(end,':');
...@@ -1139,7 +1139,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr) ...@@ -1139,7 +1139,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
end = (char *)buf + (strlen(buf)); end = (char *)buf + (strlen(buf));
out = 1; out = 1;
} }
if ((end - start)) { if ((end - start)) {
memset(num, 0, 5); memset(num, 0, 5);
memcpy(num, start, end - start); memcpy(num, start, end - start);
if (!qeth_isxdigit(num)) if (!qeth_isxdigit(num))
...@@ -1241,5 +1241,5 @@ qeth_osn_register(unsigned char *read_dev_no, ...@@ -1241,5 +1241,5 @@ qeth_osn_register(unsigned char *read_dev_no,
extern void extern void
qeth_osn_deregister(struct net_device *); qeth_osn_deregister(struct net_device *);
#endif /* __QETH_H__ */ #endif /* __QETH_H__ */
...@@ -81,7 +81,7 @@ void ...@@ -81,7 +81,7 @@ void
qeth_eddp_buf_release_contexts(struct qeth_qdio_out_buffer *buf) qeth_eddp_buf_release_contexts(struct qeth_qdio_out_buffer *buf)
{ {
struct qeth_eddp_context_reference *ref; struct qeth_eddp_context_reference *ref;
QETH_DBF_TEXT(trace, 6, "eddprctx"); QETH_DBF_TEXT(trace, 6, "eddprctx");
while (!list_empty(&buf->ctx_list)){ while (!list_empty(&buf->ctx_list)){
ref = list_entry(buf->ctx_list.next, ref = list_entry(buf->ctx_list.next,
...@@ -135,7 +135,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue, ...@@ -135,7 +135,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
"buffer!\n"); "buffer!\n");
goto out; goto out;
} }
} }
/* check if the whole next skb fits into current buffer */ /* check if the whole next skb fits into current buffer */
if ((QETH_MAX_BUFFER_ELEMENTS(queue->card) - if ((QETH_MAX_BUFFER_ELEMENTS(queue->card) -
buf->next_element_to_fill) buf->next_element_to_fill)
...@@ -148,7 +148,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue, ...@@ -148,7 +148,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
* and increment ctx's refcnt */ * and increment ctx's refcnt */
must_refcnt = 1; must_refcnt = 1;
continue; continue;
} }
if (must_refcnt){ if (must_refcnt){
must_refcnt = 0; must_refcnt = 0;
if (qeth_eddp_buf_ref_context(buf, ctx)){ if (qeth_eddp_buf_ref_context(buf, ctx)){
...@@ -266,7 +266,7 @@ qeth_eddp_copy_data_tcp(char *dst, struct qeth_eddp_data *eddp, int len, ...@@ -266,7 +266,7 @@ qeth_eddp_copy_data_tcp(char *dst, struct qeth_eddp_data *eddp, int len,
int left_in_frag; int left_in_frag;
int copy_len; int copy_len;
u8 *src; u8 *src;
QETH_DBF_TEXT(trace, 5, "eddpcdtc"); QETH_DBF_TEXT(trace, 5, "eddpcdtc");
if (skb_shinfo(eddp->skb)->nr_frags == 0) { if (skb_shinfo(eddp->skb)->nr_frags == 0) {
memcpy(dst, eddp->skb->data + eddp->skb_offset, len); memcpy(dst, eddp->skb->data + eddp->skb_offset, len);
...@@ -408,7 +408,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, ...@@ -408,7 +408,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
struct tcphdr *tcph; struct tcphdr *tcph;
int data_len; int data_len;
u32 hcsum; u32 hcsum;
QETH_DBF_TEXT(trace, 5, "eddpftcp"); QETH_DBF_TEXT(trace, 5, "eddpftcp");
eddp->skb_offset = sizeof(struct qeth_hdr) + eddp->nhl + eddp->thl; eddp->skb_offset = sizeof(struct qeth_hdr) + eddp->nhl + eddp->thl;
if (eddp->qh.hdr.l2.id == QETH_HEADER_TYPE_LAYER2) { if (eddp->qh.hdr.l2.id == QETH_HEADER_TYPE_LAYER2) {
...@@ -465,13 +465,13 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, ...@@ -465,13 +465,13 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
eddp->th.tcp.h.seq += data_len; eddp->th.tcp.h.seq += data_len;
} }
} }
static inline int static inline int
qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
struct sk_buff *skb, struct qeth_hdr *qhdr) struct sk_buff *skb, struct qeth_hdr *qhdr)
{ {
struct qeth_eddp_data *eddp = NULL; struct qeth_eddp_data *eddp = NULL;
QETH_DBF_TEXT(trace, 5, "eddpficx"); QETH_DBF_TEXT(trace, 5, "eddpficx");
/* create our segmentation headers and copy original headers */ /* create our segmentation headers and copy original headers */
if (skb->protocol == ETH_P_IP) if (skb->protocol == ETH_P_IP)
...@@ -512,7 +512,7 @@ qeth_eddp_calc_num_pages(struct qeth_eddp_context *ctx, struct sk_buff *skb, ...@@ -512,7 +512,7 @@ qeth_eddp_calc_num_pages(struct qeth_eddp_context *ctx, struct sk_buff *skb,
int hdr_len) int hdr_len)
{ {
int skbs_per_page; int skbs_per_page;
QETH_DBF_TEXT(trace, 5, "eddpcanp"); QETH_DBF_TEXT(trace, 5, "eddpcanp");
/* can we put multiple skbs in one page? */ /* can we put multiple skbs in one page? */
skbs_per_page = PAGE_SIZE / (skb_shinfo(skb)->tso_size + hdr_len); skbs_per_page = PAGE_SIZE / (skb_shinfo(skb)->tso_size + hdr_len);
...@@ -588,7 +588,7 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb, ...@@ -588,7 +588,7 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,
struct qeth_hdr *qhdr) struct qeth_hdr *qhdr)
{ {
struct qeth_eddp_context *ctx = NULL; struct qeth_eddp_context *ctx = NULL;
QETH_DBF_TEXT(trace, 5, "creddpct"); QETH_DBF_TEXT(trace, 5, "creddpct");
if (skb->protocol == ETH_P_IP) if (skb->protocol == ETH_P_IP)
ctx = qeth_eddp_create_context_generic(card, skb, ctx = qeth_eddp_create_context_generic(card, skb,
......
...@@ -42,7 +42,7 @@ qeth_create_device_attributes_osn(struct device *dev); ...@@ -42,7 +42,7 @@ qeth_create_device_attributes_osn(struct device *dev);
extern void extern void
qeth_remove_device_attributes_osn(struct device *dev); qeth_remove_device_attributes_osn(struct device *dev);
extern int extern int
qeth_create_driver_attributes(void); qeth_create_driver_attributes(void);
......
...@@ -513,7 +513,7 @@ __qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode) ...@@ -513,7 +513,7 @@ __qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode)
QETH_DBF_TEXT(setup, 3, "setoffl"); QETH_DBF_TEXT(setup, 3, "setoffl");
QETH_DBF_HEX(setup, 3, &card, sizeof(void *)); QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
if (card->dev && netif_carrier_ok(card->dev)) if (card->dev && netif_carrier_ok(card->dev))
netif_carrier_off(card->dev); netif_carrier_off(card->dev);
recover_flag = card->state; recover_flag = card->state;
...@@ -604,13 +604,13 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo, ...@@ -604,13 +604,13 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
list_for_each_entry(addr, &card->ip_list, entry) { list_for_each_entry(addr, &card->ip_list, entry) {
if (card->options.layer2) { if (card->options.layer2) {
if ((addr->type == todo->type) && if ((addr->type == todo->type) &&
(memcmp(&addr->mac, &todo->mac, (memcmp(&addr->mac, &todo->mac,
OSA_ADDR_LEN) == 0)) { OSA_ADDR_LEN) == 0)) {
found = 1; found = 1;
break; break;
} }
continue; continue;
} }
if ((addr->proto == QETH_PROT_IPV4) && if ((addr->proto == QETH_PROT_IPV4) &&
(todo->proto == QETH_PROT_IPV4) && (todo->proto == QETH_PROT_IPV4) &&
(addr->type == todo->type) && (addr->type == todo->type) &&
...@@ -694,13 +694,13 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add) ...@@ -694,13 +694,13 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
if (card->options.layer2) { if (card->options.layer2) {
if ((tmp->type == addr->type) && if ((tmp->type == addr->type) &&
(tmp->is_multicast == addr->is_multicast) && (tmp->is_multicast == addr->is_multicast) &&
(memcmp(&tmp->mac, &addr->mac, (memcmp(&tmp->mac, &addr->mac,
OSA_ADDR_LEN) == 0)) { OSA_ADDR_LEN) == 0)) {
found = 1; found = 1;
break; break;
} }
continue; continue;
} }
if ((tmp->proto == QETH_PROT_IPV4) && if ((tmp->proto == QETH_PROT_IPV4) &&
(addr->proto == QETH_PROT_IPV4) && (addr->proto == QETH_PROT_IPV4) &&
(tmp->type == addr->type) && (tmp->type == addr->type) &&
...@@ -1173,7 +1173,7 @@ qeth_determine_card_type(struct qeth_card *card) ...@@ -1173,7 +1173,7 @@ qeth_determine_card_type(struct qeth_card *card)
"due to hardware limitations!\n"); "due to hardware limitations!\n");
card->qdio.no_out_queues = 1; card->qdio.no_out_queues = 1;
card->qdio.default_out_queue = 0; card->qdio.default_out_queue = 0;
} }
return 0; return 0;
} }
i++; i++;
...@@ -1198,7 +1198,7 @@ qeth_probe_device(struct ccwgroup_device *gdev) ...@@ -1198,7 +1198,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
return -ENODEV; return -ENODEV;
QETH_DBF_TEXT_(setup, 2, "%s", gdev->dev.bus_id); QETH_DBF_TEXT_(setup, 2, "%s", gdev->dev.bus_id);
card = qeth_alloc_card(); card = qeth_alloc_card();
if (!card) { if (!card) {
put_device(dev); put_device(dev);
...@@ -1220,7 +1220,7 @@ qeth_probe_device(struct ccwgroup_device *gdev) ...@@ -1220,7 +1220,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
put_device(dev); put_device(dev);
qeth_free_card(card); qeth_free_card(card);
return rc; return rc;
} }
if ((rc = qeth_setup_card(card))){ if ((rc = qeth_setup_card(card))){
QETH_DBF_TEXT_(setup, 2, "2err%d", rc); QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
put_device(dev); put_device(dev);
...@@ -1843,7 +1843,7 @@ struct qeth_cmd_buffer *iob) ...@@ -1843,7 +1843,7 @@ struct qeth_cmd_buffer *iob)
&card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH); &card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
QETH_DBF_HEX(control, 2, iob->data, QETH_DBF_CONTROL_LEN); QETH_DBF_HEX(control, 2, iob->data, QETH_DBF_CONTROL_LEN);
} }
static int static int
qeth_send_control_data(struct qeth_card *card, int len, qeth_send_control_data(struct qeth_card *card, int len,
struct qeth_cmd_buffer *iob, struct qeth_cmd_buffer *iob,
...@@ -1937,7 +1937,7 @@ qeth_osn_send_control_data(struct qeth_card *card, int len, ...@@ -1937,7 +1937,7 @@ qeth_osn_send_control_data(struct qeth_card *card, int len,
wake_up(&card->wait_q); wake_up(&card->wait_q);
} }
return rc; return rc;
} }
static inline void static inline void
qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
...@@ -1966,7 +1966,7 @@ qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, ...@@ -1966,7 +1966,7 @@ qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2); memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
return qeth_osn_send_control_data(card, s1, iob); return qeth_osn_send_control_data(card, s1, iob);
} }
static int static int
qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob, qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
int (*reply_cb) int (*reply_cb)
...@@ -2579,7 +2579,7 @@ qeth_process_inbound_buffer(struct qeth_card *card, ...@@ -2579,7 +2579,7 @@ qeth_process_inbound_buffer(struct qeth_card *card,
skb->dev = card->dev; skb->dev = card->dev;
if (hdr->hdr.l2.id == QETH_HEADER_TYPE_LAYER2) if (hdr->hdr.l2.id == QETH_HEADER_TYPE_LAYER2)
vlan_tag = qeth_layer2_rebuild_skb(card, skb, hdr); vlan_tag = qeth_layer2_rebuild_skb(card, skb, hdr);
else if (hdr->hdr.l3.id == QETH_HEADER_TYPE_LAYER3) else if (hdr->hdr.l3.id == QETH_HEADER_TYPE_LAYER3)
qeth_rebuild_skb(card, skb, hdr); qeth_rebuild_skb(card, skb, hdr);
else { /*in case of OSN*/ else { /*in case of OSN*/
skb_push(skb, sizeof(struct qeth_hdr)); skb_push(skb, sizeof(struct qeth_hdr));
...@@ -2763,7 +2763,7 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status, ...@@ -2763,7 +2763,7 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
index = i % QDIO_MAX_BUFFERS_PER_Q; index = i % QDIO_MAX_BUFFERS_PER_Q;
buffer = &card->qdio.in_q->bufs[index]; buffer = &card->qdio.in_q->bufs[index];
if (!((status & QDIO_STATUS_LOOK_FOR_ERROR) && if (!((status & QDIO_STATUS_LOOK_FOR_ERROR) &&
qeth_check_qdio_errors(buffer->buffer, qeth_check_qdio_errors(buffer->buffer,
qdio_err, siga_err,"qinerr"))) qdio_err, siga_err,"qinerr")))
qeth_process_inbound_buffer(card, buffer, index); qeth_process_inbound_buffer(card, buffer, index);
/* clear buffer and give back to hardware */ /* clear buffer and give back to hardware */
...@@ -3187,7 +3187,7 @@ qeth_alloc_qdio_buffers(struct qeth_card *card) ...@@ -3187,7 +3187,7 @@ qeth_alloc_qdio_buffers(struct qeth_card *card)
if (card->qdio.state == QETH_QDIO_ALLOCATED) if (card->qdio.state == QETH_QDIO_ALLOCATED)
return 0; return 0;
card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q), card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q),
GFP_KERNEL|GFP_DMA); GFP_KERNEL|GFP_DMA);
if (!card->qdio.in_q) if (!card->qdio.in_q)
return - ENOMEM; return - ENOMEM;
...@@ -3476,7 +3476,7 @@ qeth_halt_channels(struct qeth_card *card) ...@@ -3476,7 +3476,7 @@ qeth_halt_channels(struct qeth_card *card)
rc3 = qeth_halt_channel(&card->data); rc3 = qeth_halt_channel(&card->data);
if (rc1) if (rc1)
return rc1; return rc1;
if (rc2) if (rc2)
return rc2; return rc2;
return rc3; return rc3;
} }
...@@ -3491,7 +3491,7 @@ qeth_clear_channels(struct qeth_card *card) ...@@ -3491,7 +3491,7 @@ qeth_clear_channels(struct qeth_card *card)
rc3 = qeth_clear_channel(&card->data); rc3 = qeth_clear_channel(&card->data);
if (rc1) if (rc1)
return rc1; return rc1;
if (rc2) if (rc2)
return rc2; return rc2;
return rc3; return rc3;
} }
...@@ -3798,10 +3798,10 @@ qeth_open(struct net_device *dev) ...@@ -3798,10 +3798,10 @@ qeth_open(struct net_device *dev)
QETH_DBF_TEXT(trace,4,"nomacadr"); QETH_DBF_TEXT(trace,4,"nomacadr");
return -EPERM; return -EPERM;
} }
card->dev->flags |= IFF_UP;
netif_start_queue(dev);
card->data.state = CH_STATE_UP; card->data.state = CH_STATE_UP;
card->state = CARD_STATE_UP; card->state = CARD_STATE_UP;
card->dev->flags |= IFF_UP;
netif_start_queue(dev);
if (!card->lan_online && netif_carrier_ok(dev)) if (!card->lan_online && netif_carrier_ok(dev))
netif_carrier_off(dev); netif_carrier_off(dev);
...@@ -3817,7 +3817,7 @@ qeth_stop(struct net_device *dev) ...@@ -3817,7 +3817,7 @@ qeth_stop(struct net_device *dev)
card = (struct qeth_card *) dev->priv; card = (struct qeth_card *) dev->priv;
netif_stop_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, ...@@ -3958,7 +3958,7 @@ qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
#endif #endif
*hdr = (struct qeth_hdr *) *hdr = (struct qeth_hdr *)
qeth_push_skb(card, skb, sizeof(struct qeth_hdr)); qeth_push_skb(card, skb, sizeof(struct qeth_hdr));
if (hdr == NULL) if (*hdr == NULL)
return -EINVAL; return -EINVAL;
return 0; return 0;
} }
...@@ -4098,7 +4098,7 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, ...@@ -4098,7 +4098,7 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
} }
} else { /* passthrough */ } else { /* passthrough */
if((skb->dev->type == ARPHRD_IEEE802_TR) && if((skb->dev->type == ARPHRD_IEEE802_TR) &&
!memcmp(skb->data + sizeof(struct qeth_hdr) + !memcmp(skb->data + sizeof(struct qeth_hdr) +
sizeof(__u16), skb->dev->broadcast, 6)) { sizeof(__u16), skb->dev->broadcast, 6)) {
hdr->hdr.l3.flags = QETH_CAST_BROADCAST | hdr->hdr.l3.flags = QETH_CAST_BROADCAST |
QETH_HDR_PASSTHRU; QETH_HDR_PASSTHRU;
...@@ -4385,7 +4385,7 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, ...@@ -4385,7 +4385,7 @@ qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
} }
static inline int static inline int
qeth_get_elements_no(struct qeth_card *card, void *hdr, qeth_get_elements_no(struct qeth_card *card, void *hdr,
struct sk_buff *skb, int elems) struct sk_buff *skb, int elems)
{ {
int elements_needed = 0; int elements_needed = 0;
...@@ -4416,6 +4416,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) ...@@ -4416,6 +4416,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO; enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;
struct qeth_eddp_context *ctx = NULL; struct qeth_eddp_context *ctx = NULL;
int tx_bytes = skb->len; int tx_bytes = skb->len;
unsigned short nr_frags = skb_shinfo(skb)->nr_frags;
unsigned short tso_size = skb_shinfo(skb)->tso_size;
int rc; int rc;
QETH_DBF_TEXT(trace, 6, "sendpkt"); QETH_DBF_TEXT(trace, 6, "sendpkt");
...@@ -4441,7 +4443,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) ...@@ -4441,7 +4443,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
return 0; return 0;
} }
cast_type = qeth_get_cast_type(card, skb); cast_type = qeth_get_cast_type(card, skb);
if ((cast_type == RTN_BROADCAST) && if ((cast_type == RTN_BROADCAST) &&
(card->info.broadcast_capable == 0)){ (card->info.broadcast_capable == 0)){
card->stats.tx_dropped++; card->stats.tx_dropped++;
card->stats.tx_errors++; card->stats.tx_errors++;
...@@ -4463,7 +4465,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) ...@@ -4463,7 +4465,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
card->stats.tx_errors++; card->stats.tx_errors++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
elements_needed++; elements_needed++;
} else { } else {
if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))) { if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))) {
...@@ -4498,16 +4500,16 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) ...@@ -4498,16 +4500,16 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
card->stats.tx_packets++; card->stats.tx_packets++;
card->stats.tx_bytes += tx_bytes; card->stats.tx_bytes += tx_bytes;
#ifdef CONFIG_QETH_PERF_STATS #ifdef CONFIG_QETH_PERF_STATS
if (skb_shinfo(skb)->tso_size && if (tso_size &&
!(large_send == QETH_LARGE_SEND_NO)) { !(large_send == QETH_LARGE_SEND_NO)) {
card->perf_stats.large_send_bytes += skb->len; card->perf_stats.large_send_bytes += tx_bytes;
card->perf_stats.large_send_cnt++; card->perf_stats.large_send_cnt++;
} }
if (skb_shinfo(skb)->nr_frags > 0){ if (nr_frags > 0){
card->perf_stats.sg_skbs_sent++; card->perf_stats.sg_skbs_sent++;
/* nr_frags + skb->data */ /* nr_frags + skb->data */
card->perf_stats.sg_frags_sent += card->perf_stats.sg_frags_sent +=
skb_shinfo(skb)->nr_frags + 1; nr_frags + 1;
} }
#endif /* CONFIG_QETH_PERF_STATS */ #endif /* CONFIG_QETH_PERF_STATS */
} }
...@@ -5373,7 +5375,7 @@ qeth_layer2_send_setdelvlan_cb(struct qeth_card *card, ...@@ -5373,7 +5375,7 @@ qeth_layer2_send_setdelvlan_cb(struct qeth_card *card,
cmd = (struct qeth_ipa_cmd *) data; cmd = (struct qeth_ipa_cmd *) data;
if (cmd->hdr.return_code) { if (cmd->hdr.return_code) {
PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. " PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. "
"Continuing\n",cmd->data.setdelvlan.vlan_id, "Continuing\n",cmd->data.setdelvlan.vlan_id,
QETH_CARD_IFNAME(card), cmd->hdr.return_code); QETH_CARD_IFNAME(card), cmd->hdr.return_code);
QETH_DBF_TEXT_(trace, 2, "L2VL%4x", cmd->hdr.command); QETH_DBF_TEXT_(trace, 2, "L2VL%4x", cmd->hdr.command);
QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card)); QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card));
...@@ -5393,7 +5395,7 @@ qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i, ...@@ -5393,7 +5395,7 @@ qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4); iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE); cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
cmd->data.setdelvlan.vlan_id = i; cmd->data.setdelvlan.vlan_id = i;
return qeth_send_ipa_cmd(card, iob, return qeth_send_ipa_cmd(card, iob,
qeth_layer2_send_setdelvlan_cb, NULL); qeth_layer2_send_setdelvlan_cb, NULL);
} }
...@@ -5457,7 +5459,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) ...@@ -5457,7 +5459,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
* Examine hardware response to SET_PROMISC_MODE * Examine hardware response to SET_PROMISC_MODE
*/ */
static int static int
qeth_setadp_promisc_mode_cb(struct qeth_card *card, qeth_setadp_promisc_mode_cb(struct qeth_card *card,
struct qeth_reply *reply, struct qeth_reply *reply,
unsigned long data) unsigned long data)
{ {
...@@ -5468,10 +5470,10 @@ qeth_setadp_promisc_mode_cb(struct qeth_card *card, ...@@ -5468,10 +5470,10 @@ qeth_setadp_promisc_mode_cb(struct qeth_card *card,
cmd = (struct qeth_ipa_cmd *) data; cmd = (struct qeth_ipa_cmd *) data;
setparms = &(cmd->data.setadapterparms); setparms = &(cmd->data.setadapterparms);
qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd); qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
if (cmd->hdr.return_code) { if (cmd->hdr.return_code) {
QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code); QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code);
setparms->data.mode = SET_PROMISC_MODE_OFF; setparms->data.mode = SET_PROMISC_MODE_OFF;
} }
card->info.promisc_mode = setparms->data.mode; card->info.promisc_mode = setparms->data.mode;
...@@ -5517,7 +5519,7 @@ qeth_set_multicast_list(struct net_device *dev) ...@@ -5517,7 +5519,7 @@ qeth_set_multicast_list(struct net_device *dev)
if (card->info.type == QETH_CARD_TYPE_OSN) if (card->info.type == QETH_CARD_TYPE_OSN)
return ; return ;
QETH_DBF_TEXT(trace, 3, "setmulti"); QETH_DBF_TEXT(trace, 3, "setmulti");
qeth_delete_mc_addresses(card); qeth_delete_mc_addresses(card);
if (card->options.layer2) { if (card->options.layer2) {
...@@ -5575,7 +5577,7 @@ qeth_osn_assist(struct net_device *dev, ...@@ -5575,7 +5577,7 @@ qeth_osn_assist(struct net_device *dev,
struct qeth_cmd_buffer *iob; struct qeth_cmd_buffer *iob;
struct qeth_card *card; struct qeth_card *card;
int rc; int rc;
QETH_DBF_TEXT(trace, 2, "osnsdmc"); QETH_DBF_TEXT(trace, 2, "osnsdmc");
if (!dev) if (!dev)
return -ENODEV; return -ENODEV;
...@@ -5654,7 +5656,7 @@ qeth_osn_deregister(struct net_device * dev) ...@@ -5654,7 +5656,7 @@ qeth_osn_deregister(struct net_device * dev)
card->osn_info.data_cb = NULL; card->osn_info.data_cb = NULL;
return; return;
} }
static void static void
qeth_delete_mc_addresses(struct qeth_card *card) qeth_delete_mc_addresses(struct qeth_card *card)
{ {
...@@ -5818,7 +5820,7 @@ qeth_add_multicast_ipv6(struct qeth_card *card) ...@@ -5818,7 +5820,7 @@ qeth_add_multicast_ipv6(struct qeth_card *card)
struct inet6_dev *in6_dev; struct inet6_dev *in6_dev;
QETH_DBF_TEXT(trace,4,"chkmcv6"); QETH_DBF_TEXT(trace,4,"chkmcv6");
if (!qeth_is_supported(card, IPA_IPV6)) if (!qeth_is_supported(card, IPA_IPV6))
return ; return ;
in6_dev = in6_dev_get(card->dev); in6_dev = in6_dev_get(card->dev);
if (in6_dev == NULL) if (in6_dev == NULL)
...@@ -6359,12 +6361,9 @@ qeth_netdev_init(struct net_device *dev) ...@@ -6359,12 +6361,9 @@ qeth_netdev_init(struct net_device *dev)
dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid; dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid;
dev->vlan_rx_add_vid = qeth_vlan_rx_add_vid; dev->vlan_rx_add_vid = qeth_vlan_rx_add_vid;
#endif #endif
dev->hard_header = card->orig_hard_header;
if (qeth_get_netdev_flags(card) & IFF_NOARP) { if (qeth_get_netdev_flags(card) & IFF_NOARP) {
dev->rebuild_header = NULL; dev->rebuild_header = NULL;
dev->hard_header = NULL; dev->hard_header = NULL;
if (card->options.fake_ll)
dev->hard_header = qeth_fake_header;
dev->header_cache_update = NULL; dev->header_cache_update = NULL;
dev->hard_header_cache = NULL; dev->hard_header_cache = NULL;
} }
...@@ -6373,6 +6372,9 @@ qeth_netdev_init(struct net_device *dev) ...@@ -6373,6 +6372,9 @@ qeth_netdev_init(struct net_device *dev)
if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD)) if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
card->dev->dev_id = card->info.unique_id & 0xffff; card->dev->dev_id = card->info.unique_id & 0xffff;
#endif #endif
if (card->options.fake_ll &&
(qeth_get_netdev_flags(card) & IFF_NOARP))
dev->hard_header = qeth_fake_header;
dev->hard_header_parse = NULL; dev->hard_header_parse = NULL;
dev->set_mac_address = qeth_layer2_set_mac_address; dev->set_mac_address = qeth_layer2_set_mac_address;
dev->flags |= qeth_get_netdev_flags(card); dev->flags |= qeth_get_netdev_flags(card);
...@@ -6477,6 +6479,9 @@ qeth_hardsetup_card(struct qeth_card *card) ...@@ -6477,6 +6479,9 @@ qeth_hardsetup_card(struct qeth_card *card)
/*network device will be recovered*/ /*network device will be recovered*/
if (card->dev) { if (card->dev) {
card->dev->hard_header = card->orig_hard_header; card->dev->hard_header = card->orig_hard_header;
if (card->options.fake_ll &&
(qeth_get_netdev_flags(card) & IFF_NOARP))
card->dev->hard_header = qeth_fake_header;
return 0; return 0;
} }
/* at first set_online allocate netdev */ /* at first set_online allocate netdev */
...@@ -6584,7 +6589,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card, ...@@ -6584,7 +6589,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
cmd = (struct qeth_ipa_cmd *) data; cmd = (struct qeth_ipa_cmd *) data;
if (!card->options.layer2 || card->info.guestlan || if (!card->options.layer2 || card->info.guestlan ||
!(card->info.mac_bits & QETH_LAYER2_MAC_READ)) { !(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
memcpy(card->dev->dev_addr, memcpy(card->dev->dev_addr,
&cmd->data.setadapterparms.data.change_addr.addr, &cmd->data.setadapterparms.data.change_addr.addr,
OSA_ADDR_LEN); OSA_ADDR_LEN);
...@@ -7031,14 +7036,12 @@ qeth_softsetup_ipv6(struct qeth_card *card) ...@@ -7031,14 +7036,12 @@ qeth_softsetup_ipv6(struct qeth_card *card)
QETH_DBF_TEXT(trace,3,"softipv6"); QETH_DBF_TEXT(trace,3,"softipv6");
netif_stop_queue(card->dev);
rc = qeth_send_startlan(card, QETH_PROT_IPV6); rc = qeth_send_startlan(card, QETH_PROT_IPV6);
if (rc) { if (rc) {
PRINT_ERR("IPv6 startlan failed on %s\n", PRINT_ERR("IPv6 startlan failed on %s\n",
QETH_CARD_IFNAME(card)); QETH_CARD_IFNAME(card));
return rc; return rc;
} }
netif_wake_queue(card->dev);
rc = qeth_query_ipassists(card,QETH_PROT_IPV6); rc = qeth_query_ipassists(card,QETH_PROT_IPV6);
if (rc) { if (rc) {
PRINT_ERR("IPv6 query ipassist failed on %s\n", PRINT_ERR("IPv6 query ipassist failed on %s\n",
...@@ -7352,7 +7355,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type) ...@@ -7352,7 +7355,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
card->options.large_send = type; card->options.large_send = type;
return 0; return 0;
} }
netif_stop_queue(card->dev); if (card->state == CARD_STATE_UP)
netif_tx_disable(card->dev);
card->options.large_send = type; card->options.large_send = type;
switch (card->options.large_send) { switch (card->options.large_send) {
case QETH_LARGE_SEND_EDDP: case QETH_LARGE_SEND_EDDP:
...@@ -7374,7 +7378,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type) ...@@ -7374,7 +7378,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG); card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG);
break; break;
} }
netif_wake_queue(card->dev); if (card->state == CARD_STATE_UP)
netif_wake_queue(card->dev);
return rc; return rc;
} }
...@@ -7427,7 +7432,7 @@ qeth_softsetup_card(struct qeth_card *card) ...@@ -7427,7 +7432,7 @@ qeth_softsetup_card(struct qeth_card *card)
if ((rc = qeth_setrouting_v6(card))) if ((rc = qeth_setrouting_v6(card)))
QETH_DBF_TEXT_(setup, 2, "5err%d", rc); QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
out: out:
netif_stop_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) ...@@ -7567,7 +7572,7 @@ qeth_stop_card(struct qeth_card *card, int recovery_mode)
if (card->read.state == CH_STATE_UP && if (card->read.state == CH_STATE_UP &&
card->write.state == CH_STATE_UP && card->write.state == CH_STATE_UP &&
(card->state == CARD_STATE_UP)) { (card->state == CARD_STATE_UP)) {
if (recovery_mode && if (recovery_mode &&
card->info.type != QETH_CARD_TYPE_OSN) { card->info.type != QETH_CARD_TYPE_OSN) {
qeth_stop(card->dev); qeth_stop(card->dev);
} else { } else {
...@@ -7736,10 +7741,8 @@ static int ...@@ -7736,10 +7741,8 @@ static int
qeth_register_netdev(struct qeth_card *card) qeth_register_netdev(struct qeth_card *card)
{ {
QETH_DBF_TEXT(setup, 3, "regnetd"); QETH_DBF_TEXT(setup, 3, "regnetd");
if (card->dev->reg_state != NETREG_UNINITIALIZED) { if (card->dev->reg_state != NETREG_UNINITIALIZED)
qeth_netdev_init(card->dev);
return 0; return 0;
}
/* sysfs magic */ /* sysfs magic */
SET_NETDEV_DEV(card->dev, &card->gdev->dev); SET_NETDEV_DEV(card->dev, &card->gdev->dev);
return register_netdev(card->dev); return register_netdev(card->dev);
...@@ -7750,7 +7753,7 @@ qeth_start_again(struct qeth_card *card, int recovery_mode) ...@@ -7750,7 +7753,7 @@ qeth_start_again(struct qeth_card *card, int recovery_mode)
{ {
QETH_DBF_TEXT(setup ,2, "startag"); QETH_DBF_TEXT(setup ,2, "startag");
if (recovery_mode && if (recovery_mode &&
card->info.type != QETH_CARD_TYPE_OSN) { card->info.type != QETH_CARD_TYPE_OSN) {
qeth_open(card->dev); qeth_open(card->dev);
} else { } else {
......
...@@ -445,7 +445,7 @@ enum qeth_ipa_arp_return_codes { ...@@ -445,7 +445,7 @@ enum qeth_ipa_arp_return_codes {
/* Helper functions */ /* Helper functions */
#define IS_IPA_REPLY(cmd) ((cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST) || \ #define IS_IPA_REPLY(cmd) ((cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST) || \
(cmd->hdr.initiator == IPA_CMD_INITIATOR_OSA_REPLY)) (cmd->hdr.initiator == IPA_CMD_INITIATOR_OSA_REPLY))
/*****************************************************************************/ /*****************************************************************************/
/* END OF IP Assist related definitions */ /* END OF IP Assist related definitions */
/*****************************************************************************/ /*****************************************************************************/
...@@ -490,7 +490,7 @@ extern unsigned char ULP_ENABLE[]; ...@@ -490,7 +490,7 @@ extern unsigned char ULP_ENABLE[];
/* Layer 2 defintions */ /* Layer 2 defintions */
#define QETH_PROT_LAYER2 0x08 #define QETH_PROT_LAYER2 0x08
#define QETH_PROT_TCPIP 0x03 #define QETH_PROT_TCPIP 0x03
#define QETH_PROT_OSN2 0x0a #define QETH_PROT_OSN2 0x0a
#define QETH_ULP_ENABLE_PROT_TYPE(buffer) (buffer+0x50) #define QETH_ULP_ENABLE_PROT_TYPE(buffer) (buffer+0x50)
#define QETH_IPA_CMD_PROT_TYPE(buffer) (buffer+0x19) #define QETH_IPA_CMD_PROT_TYPE(buffer) (buffer+0x19)
......
...@@ -36,7 +36,7 @@ qeth_procfile_seq_start(struct seq_file *s, loff_t *offset) ...@@ -36,7 +36,7 @@ qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
{ {
struct device *dev = NULL; struct device *dev = NULL;
loff_t nr = 0; loff_t nr = 0;
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem); down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
if (*offset == 0) if (*offset == 0)
return SEQ_START_TOKEN; return SEQ_START_TOKEN;
...@@ -60,8 +60,8 @@ static void * ...@@ -60,8 +60,8 @@ static void *
qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset) qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
{ {
struct device *prev, *next; struct device *prev, *next;
if (it == SEQ_START_TOKEN) if (it == SEQ_START_TOKEN)
prev = NULL; prev = NULL;
else else
prev = (struct device *) it; prev = (struct device *) it;
...@@ -180,7 +180,7 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it) ...@@ -180,7 +180,7 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
struct device *device; struct device *device;
struct qeth_card *card; struct qeth_card *card;
if (it == SEQ_START_TOKEN) if (it == SEQ_START_TOKEN)
return 0; return 0;
......
...@@ -785,7 +785,7 @@ qeth_dev_large_send_store(struct device *dev, struct device_attribute *attr, con ...@@ -785,7 +785,7 @@ qeth_dev_large_send_store(struct device *dev, struct device_attribute *attr, con
} }
if (card->options.large_send == type) if (card->options.large_send == type)
return count; return count;
if ((rc = qeth_set_large_send(card, type))) if ((rc = qeth_set_large_send(card, type)))
return rc; return rc;
return count; return count;
} }
...@@ -1682,7 +1682,7 @@ qeth_create_device_attributes(struct device *dev) ...@@ -1682,7 +1682,7 @@ qeth_create_device_attributes(struct device *dev)
if (card->info.type == QETH_CARD_TYPE_OSN) if (card->info.type == QETH_CARD_TYPE_OSN)
return sysfs_create_group(&dev->kobj, return sysfs_create_group(&dev->kobj,
&qeth_osn_device_attr_group); &qeth_osn_device_attr_group);
if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group))) if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group)))
return ret; return ret;
if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group))){ if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group))){
...@@ -1713,7 +1713,7 @@ qeth_remove_device_attributes(struct device *dev) ...@@ -1713,7 +1713,7 @@ qeth_remove_device_attributes(struct device *dev)
if (card->info.type == QETH_CARD_TYPE_OSN) if (card->info.type == QETH_CARD_TYPE_OSN)
return sysfs_remove_group(&dev->kobj, return sysfs_remove_group(&dev->kobj,
&qeth_osn_device_attr_group); &qeth_osn_device_attr_group);
sysfs_remove_group(&dev->kobj, &qeth_device_attr_group); sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group); sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group); sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
......
...@@ -117,11 +117,11 @@ __qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer, ...@@ -117,11 +117,11 @@ __qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer,
int fragno; int fragno;
unsigned long addr; unsigned long addr;
int element, cnt, dlen; int element, cnt, dlen;
fragno = skb_shinfo(skb)->nr_frags; fragno = skb_shinfo(skb)->nr_frags;
element = *next_element_to_fill; element = *next_element_to_fill;
dlen = 0; dlen = 0;
if (is_tso) if (is_tso)
buffer->element[element].flags = buffer->element[element].flags =
SBAL_FLAGS_MIDDLE_FRAG; SBAL_FLAGS_MIDDLE_FRAG;
......
...@@ -1164,14 +1164,16 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) ...@@ -1164,14 +1164,16 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
struct fs_uart_platform_info *pdata; struct fs_uart_platform_info *pdata;
struct platform_device* pdev = early_uart_get_pdev(co->index); struct platform_device* pdev = early_uart_get_pdev(co->index);
port =
(struct uart_port *)&cpm_uart_ports[cpm_uart_port_map[co->index]];
pinfo = (struct uart_cpm_port *)port;
if (!pdev) { if (!pdev) {
pr_info("cpm_uart: console: compat mode\n"); pr_info("cpm_uart: console: compat mode\n");
/* compatibility - will be cleaned up */ /* compatibility - will be cleaned up */
cpm_uart_init_portdesc(); cpm_uart_init_portdesc();
}
port =
(struct uart_port *)&cpm_uart_ports[cpm_uart_port_map[co->index]];
pinfo = (struct uart_cpm_port *)port;
if (!pdev) {
if (pinfo->set_lineif) if (pinfo->set_lineif)
pinfo->set_lineif(pinfo); pinfo->set_lineif(pinfo);
} else { } else {
......
...@@ -213,7 +213,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con) ...@@ -213,7 +213,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize); L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize);
if (is_con) { if (is_con) {
mem_addr = alloc_bootmem(memsz); mem_addr = alloc_bootmem(memsz);
dma_addr = mem_addr; dma_addr = virt_to_bus(mem_addr);
} }
else else
mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr, mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册