Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
This commit is contained in:
commit
a7c2491a13
9 changed files with 77 additions and 263 deletions
|
@ -38,6 +38,10 @@
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
|
MODULE_DESCRIPTION("PHY library");
|
||||||
|
MODULE_AUTHOR("Andy Fleming");
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
static struct phy_driver genphy_driver;
|
static struct phy_driver genphy_driver;
|
||||||
extern int mdio_bus_init(void);
|
extern int mdio_bus_init(void);
|
||||||
extern void mdio_bus_exit(void);
|
extern void mdio_bus_exit(void);
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
/* orinoco_nortel.c
|
/* orinoco_nortel.c
|
||||||
*
|
*
|
||||||
* Driver for Prism II devices which would usually be driven by orinoco_cs,
|
* Driver for Prism II devices which would usually be driven by orinoco_cs,
|
||||||
|
* but are connected to the PCI bus by a PCI-to-PCMCIA adapter used in
|
||||||
|
* Nortel emobility, Symbol LA-4113 and Symbol LA-4123.
|
||||||
* but are connected to the PCI bus by a Nortel PCI-PCMCIA-Adapter.
|
* but are connected to the PCI bus by a Nortel PCI-PCMCIA-Adapter.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002 Tobias Hoffmann
|
* Copyright (C) 2002 Tobias Hoffmann
|
||||||
|
@ -165,7 +167,7 @@ static int nortel_pci_init_one(struct pci_dev *pdev,
|
||||||
goto fail_resources;
|
goto fail_resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
iomem = pci_iomap(pdev, 3, 0);
|
iomem = pci_iomap(pdev, 2, 0);
|
||||||
if (!iomem) {
|
if (!iomem) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto fail_map_io;
|
goto fail_map_io;
|
||||||
|
@ -265,6 +267,8 @@ static void __devexit nortel_pci_remove_one(struct pci_dev *pdev)
|
||||||
static struct pci_device_id nortel_pci_id_table[] = {
|
static struct pci_device_id nortel_pci_id_table[] = {
|
||||||
/* Nortel emobility PCI */
|
/* Nortel emobility PCI */
|
||||||
{0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,},
|
{0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,},
|
||||||
|
/* Symbol LA-4123 PCI */
|
||||||
|
{0x1562, 0x0001, PCI_ANY_ID, PCI_ANY_ID,},
|
||||||
{0,},
|
{0,},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,8 @@ qeth_eddp_free_context(struct qeth_eddp_context *ctx)
|
||||||
for (i = 0; i < ctx->num_pages; ++i)
|
for (i = 0; i < ctx->num_pages; ++i)
|
||||||
free_page((unsigned long)ctx->pages[i]);
|
free_page((unsigned long)ctx->pages[i]);
|
||||||
kfree(ctx->pages);
|
kfree(ctx->pages);
|
||||||
kfree(ctx->elements);
|
if (ctx->elements != NULL)
|
||||||
|
kfree(ctx->elements);
|
||||||
kfree(ctx);
|
kfree(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* linux/drivers/s390/net/qeth_main.c ($Revision: 1.242 $)
|
* linux/drivers/s390/net/qeth_main.c ($Revision: 1.251 $)
|
||||||
*
|
*
|
||||||
* Linux on zSeries OSA Express and HiperSockets support
|
* Linux on zSeries OSA Express and HiperSockets support
|
||||||
*
|
*
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
* Frank Pavlic (fpavlic@de.ibm.com) and
|
* Frank Pavlic (fpavlic@de.ibm.com) and
|
||||||
* Thomas Spatzier <tspat@de.ibm.com>
|
* Thomas Spatzier <tspat@de.ibm.com>
|
||||||
*
|
*
|
||||||
* $Revision: 1.242 $ $Date: 2005/05/04 20:19:18 $
|
* $Revision: 1.251 $ $Date: 2005/05/04 20:19:18 $
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -72,7 +72,7 @@
|
||||||
#include "qeth_eddp.h"
|
#include "qeth_eddp.h"
|
||||||
#include "qeth_tso.h"
|
#include "qeth_tso.h"
|
||||||
|
|
||||||
#define VERSION_QETH_C "$Revision: 1.242 $"
|
#define VERSION_QETH_C "$Revision: 1.251 $"
|
||||||
static const char *version = "qeth S/390 OSA-Express driver";
|
static const char *version = "qeth S/390 OSA-Express driver";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -518,7 +518,8 @@ __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 *));
|
||||||
|
|
||||||
|
netif_carrier_off(card->dev);
|
||||||
recover_flag = card->state;
|
recover_flag = card->state;
|
||||||
if (qeth_stop_card(card, recovery_mode) == -ERESTARTSYS){
|
if (qeth_stop_card(card, recovery_mode) == -ERESTARTSYS){
|
||||||
PRINT_WARN("Stopping card %s interrupted by user!\n",
|
PRINT_WARN("Stopping card %s interrupted by user!\n",
|
||||||
|
@ -1020,7 +1021,6 @@ void
|
||||||
qeth_schedule_recovery(struct qeth_card *card)
|
qeth_schedule_recovery(struct qeth_card *card)
|
||||||
{
|
{
|
||||||
QETH_DBF_TEXT(trace,2,"startrec");
|
QETH_DBF_TEXT(trace,2,"startrec");
|
||||||
|
|
||||||
if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
|
if (qeth_set_thread_start_bit(card, QETH_RECOVER_THREAD) == 0)
|
||||||
schedule_work(&card->kernel_thread_starter);
|
schedule_work(&card->kernel_thread_starter);
|
||||||
}
|
}
|
||||||
|
@ -1710,7 +1710,6 @@ qeth_check_ipa_data(struct qeth_card *card, struct qeth_cmd_buffer *iob)
|
||||||
"IP address reset.\n",
|
"IP address reset.\n",
|
||||||
QETH_CARD_IFNAME(card),
|
QETH_CARD_IFNAME(card),
|
||||||
card->info.chpid);
|
card->info.chpid);
|
||||||
netif_carrier_on(card->dev);
|
|
||||||
qeth_schedule_recovery(card);
|
qeth_schedule_recovery(card);
|
||||||
return NULL;
|
return NULL;
|
||||||
case IPA_CMD_MODCCID:
|
case IPA_CMD_MODCCID:
|
||||||
|
@ -1959,7 +1958,7 @@ qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||||
{
|
{
|
||||||
u16 s1, s2;
|
u16 s1, s2;
|
||||||
|
|
||||||
QETH_DBF_TEXT(trace,4,"osndipa");
|
QETH_DBF_TEXT(trace,4,"osndipa");
|
||||||
|
|
||||||
qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
|
qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);
|
||||||
s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
|
s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len);
|
||||||
|
@ -2203,24 +2202,21 @@ qeth_ulp_setup(struct qeth_card *card)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
qeth_check_for_inbound_error(struct qeth_qdio_buffer *buf,
|
qeth_check_qdio_errors(struct qdio_buffer *buf, unsigned int qdio_error,
|
||||||
unsigned int qdio_error,
|
unsigned int siga_error, const char *dbftext)
|
||||||
unsigned int siga_error)
|
|
||||||
{
|
{
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
if (qdio_error || siga_error) {
|
if (qdio_error || siga_error) {
|
||||||
QETH_DBF_TEXT(trace, 2, "qdinerr");
|
QETH_DBF_TEXT(trace, 2, dbftext);
|
||||||
QETH_DBF_TEXT(qerr, 2, "qdinerr");
|
QETH_DBF_TEXT(qerr, 2, dbftext);
|
||||||
QETH_DBF_TEXT_(qerr, 2, " F15=%02X",
|
QETH_DBF_TEXT_(qerr, 2, " F15=%02X",
|
||||||
buf->buffer->element[15].flags & 0xff);
|
buf->element[15].flags & 0xff);
|
||||||
QETH_DBF_TEXT_(qerr, 2, " F14=%02X",
|
QETH_DBF_TEXT_(qerr, 2, " F14=%02X",
|
||||||
buf->buffer->element[14].flags & 0xff);
|
buf->element[14].flags & 0xff);
|
||||||
QETH_DBF_TEXT_(qerr, 2, " qerr=%X", qdio_error);
|
QETH_DBF_TEXT_(qerr, 2, " qerr=%X", qdio_error);
|
||||||
QETH_DBF_TEXT_(qerr, 2, " serr=%X", siga_error);
|
QETH_DBF_TEXT_(qerr, 2, " serr=%X", siga_error);
|
||||||
rc = 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return rc;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct sk_buff *
|
static inline struct sk_buff *
|
||||||
|
@ -2769,8 +2765,9 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
|
||||||
for (i = first_element; i < (first_element + count); ++i) {
|
for (i = first_element; i < (first_element + count); ++i) {
|
||||||
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_for_inbound_error(buffer, qdio_err, siga_err)))
|
qeth_check_qdio_errors(buffer->buffer,
|
||||||
|
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 */
|
||||||
qeth_put_buffer_pool_entry(card, buffer->pool_entry);
|
qeth_put_buffer_pool_entry(card, buffer->pool_entry);
|
||||||
|
@ -2785,12 +2782,13 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
|
||||||
static inline int
|
static inline int
|
||||||
qeth_handle_send_error(struct qeth_card *card,
|
qeth_handle_send_error(struct qeth_card *card,
|
||||||
struct qeth_qdio_out_buffer *buffer,
|
struct qeth_qdio_out_buffer *buffer,
|
||||||
int qdio_err, int siga_err)
|
unsigned int qdio_err, unsigned int siga_err)
|
||||||
{
|
{
|
||||||
int sbalf15 = buffer->buffer->element[15].flags & 0xff;
|
int sbalf15 = buffer->buffer->element[15].flags & 0xff;
|
||||||
int cc = siga_err & 3;
|
int cc = siga_err & 3;
|
||||||
|
|
||||||
QETH_DBF_TEXT(trace, 6, "hdsnderr");
|
QETH_DBF_TEXT(trace, 6, "hdsnderr");
|
||||||
|
qeth_check_qdio_errors(buffer->buffer, qdio_err, siga_err, "qouterr");
|
||||||
switch (cc) {
|
switch (cc) {
|
||||||
case 0:
|
case 0:
|
||||||
if (qdio_err){
|
if (qdio_err){
|
||||||
|
@ -3047,7 +3045,8 @@ qeth_qdio_output_handler(struct ccw_device * ccwdev, unsigned int status,
|
||||||
for(i = first_element; i < (first_element + count); ++i){
|
for(i = first_element; i < (first_element + count); ++i){
|
||||||
buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
|
buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
|
||||||
/*we only handle the KICK_IT error by doing a recovery */
|
/*we only handle the KICK_IT error by doing a recovery */
|
||||||
if (qeth_handle_send_error(card, buffer, qdio_error, siga_error)
|
if (qeth_handle_send_error(card, buffer,
|
||||||
|
qdio_error, siga_error)
|
||||||
== QETH_SEND_ERROR_KICK_IT){
|
== QETH_SEND_ERROR_KICK_IT){
|
||||||
netif_stop_queue(card->dev);
|
netif_stop_queue(card->dev);
|
||||||
qeth_schedule_recovery(card);
|
qeth_schedule_recovery(card);
|
||||||
|
@ -3289,7 +3288,6 @@ qeth_init_qdio_info(struct qeth_card *card)
|
||||||
card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
|
card->qdio.in_buf_pool.buf_count = card->qdio.init_pool.buf_count;
|
||||||
INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
|
INIT_LIST_HEAD(&card->qdio.in_buf_pool.entry_list);
|
||||||
INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
|
INIT_LIST_HEAD(&card->qdio.init_pool.entry_list);
|
||||||
/* outbound */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -3731,6 +3729,9 @@ qeth_verify_vlan_dev(struct net_device *dev, struct qeth_card *card)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (rc && !(VLAN_DEV_INFO(dev)->real_dev->priv == (void *)card))
|
||||||
|
return 0;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -3807,10 +3808,8 @@ qeth_open(struct net_device *dev)
|
||||||
card->data.state = CH_STATE_UP;
|
card->data.state = CH_STATE_UP;
|
||||||
card->state = CARD_STATE_UP;
|
card->state = CARD_STATE_UP;
|
||||||
|
|
||||||
if (!card->lan_online){
|
if (!card->lan_online && netif_carrier_ok(dev))
|
||||||
if (netif_carrier_ok(dev))
|
netif_carrier_off(dev);
|
||||||
netif_carrier_off(dev);
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5870,10 +5869,8 @@ 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 ((card->options.layer2 == 0) &&
|
if (!qeth_is_supported(card, IPA_IPV6))
|
||||||
(!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)
|
||||||
return;
|
return;
|
||||||
|
@ -7936,8 +7933,8 @@ __qeth_set_online(struct ccwgroup_device *gdev, int recovery_mode)
|
||||||
QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
|
QETH_DBF_TEXT_(setup, 2, "6err%d", rc);
|
||||||
goto out_remove;
|
goto out_remove;
|
||||||
}
|
}
|
||||||
/*maybe it was set offline without ifconfig down
|
netif_carrier_on(card->dev);
|
||||||
* we can also use this state for recovery purposes*/
|
|
||||||
qeth_set_allowed_threads(card, 0xffffffff, 0);
|
qeth_set_allowed_threads(card, 0xffffffff, 0);
|
||||||
if (recover_flag == CARD_STATE_RECOVER)
|
if (recover_flag == CARD_STATE_RECOVER)
|
||||||
qeth_start_again(card, recovery_mode);
|
qeth_start_again(card, recovery_mode);
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include <asm/cio.h>
|
#include <asm/cio.h>
|
||||||
#include "qeth_mpc.h"
|
#include "qeth_mpc.h"
|
||||||
|
|
||||||
const char *VERSION_QETH_MPC_C = "$Revision: 1.12 $";
|
const char *VERSION_QETH_MPC_C = "$Revision: 1.13 $";
|
||||||
|
|
||||||
unsigned char IDX_ACTIVATE_READ[]={
|
unsigned char IDX_ACTIVATE_READ[]={
|
||||||
0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0x00,
|
0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0x00,
|
||||||
|
|
|
@ -14,14 +14,14 @@
|
||||||
|
|
||||||
#include <asm/qeth.h>
|
#include <asm/qeth.h>
|
||||||
|
|
||||||
#define VERSION_QETH_MPC_H "$Revision: 1.44 $"
|
#define VERSION_QETH_MPC_H "$Revision: 1.46 $"
|
||||||
|
|
||||||
extern const char *VERSION_QETH_MPC_C;
|
extern const char *VERSION_QETH_MPC_C;
|
||||||
|
|
||||||
#define IPA_PDU_HEADER_SIZE 0x40
|
#define IPA_PDU_HEADER_SIZE 0x40
|
||||||
#define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e)
|
#define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e)
|
||||||
#define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26)
|
#define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26)
|
||||||
#define QETH_IPA_PDU_LEN_PDU2(buffer) (buffer+0x2a)
|
#define QETH_IPA_PDU_LEN_PDU2(buffer) (buffer+0x29)
|
||||||
#define QETH_IPA_PDU_LEN_PDU3(buffer) (buffer+0x3a)
|
#define QETH_IPA_PDU_LEN_PDU3(buffer) (buffer+0x3a)
|
||||||
|
|
||||||
extern unsigned char IPA_PDU_HEADER[];
|
extern unsigned char IPA_PDU_HEADER[];
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* linux/drivers/s390/net/qeth_fs.c ($Revision: 1.13 $)
|
* linux/drivers/s390/net/qeth_fs.c ($Revision: 1.16 $)
|
||||||
*
|
*
|
||||||
* Linux on zSeries OSA Express and HiperSockets support
|
* Linux on zSeries OSA Express and HiperSockets support
|
||||||
* This file contains code related to procfs.
|
* This file contains code related to procfs.
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
#include "qeth_mpc.h"
|
#include "qeth_mpc.h"
|
||||||
#include "qeth_fs.h"
|
#include "qeth_fs.h"
|
||||||
|
|
||||||
const char *VERSION_QETH_PROC_C = "$Revision: 1.13 $";
|
const char *VERSION_QETH_PROC_C = "$Revision: 1.16 $";
|
||||||
|
|
||||||
/***** /proc/qeth *****/
|
/***** /proc/qeth *****/
|
||||||
#define QETH_PROCFILE_NAME "qeth"
|
#define QETH_PROCFILE_NAME "qeth"
|
||||||
|
@ -30,30 +30,26 @@ static struct proc_dir_entry *qeth_procfile;
|
||||||
static int
|
static int
|
||||||
qeth_procfile_seq_match(struct device *dev, void *data)
|
qeth_procfile_seq_match(struct device *dev, void *data)
|
||||||
{
|
{
|
||||||
return 1;
|
return(dev ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
||||||
{
|
{
|
||||||
struct device *dev;
|
struct device *dev = NULL;
|
||||||
loff_t nr;
|
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)
|
||||||
nr = *offset;
|
|
||||||
if (nr == 0)
|
|
||||||
return SEQ_START_TOKEN;
|
return SEQ_START_TOKEN;
|
||||||
|
while (1) {
|
||||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL,
|
|
||||||
NULL, qeth_procfile_seq_match);
|
|
||||||
|
|
||||||
/* get card at pos *offset */
|
|
||||||
nr = *offset;
|
|
||||||
while (nr-- > 1 && dev)
|
|
||||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
|
dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
|
||||||
NULL, qeth_procfile_seq_match);
|
NULL, qeth_procfile_seq_match);
|
||||||
return (void *) dev;
|
if (++nr == *offset)
|
||||||
|
break;
|
||||||
|
put_device(dev);
|
||||||
|
}
|
||||||
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -66,19 +62,14 @@ 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)
|
||||||
next = driver_find_device(&qeth_ccwgroup_driver.driver,
|
prev = NULL;
|
||||||
NULL, NULL, qeth_procfile_seq_match);
|
else
|
||||||
if (next)
|
prev = (struct device *) it;
|
||||||
(*offset)++;
|
|
||||||
return (void *) next;
|
|
||||||
}
|
|
||||||
prev = (struct device *) it;
|
|
||||||
next = driver_find_device(&qeth_ccwgroup_driver.driver,
|
next = driver_find_device(&qeth_ccwgroup_driver.driver,
|
||||||
prev, NULL, qeth_procfile_seq_match);
|
prev, NULL, qeth_procfile_seq_match);
|
||||||
if (next)
|
(*offset)++;
|
||||||
(*offset)++;
|
|
||||||
return (void *) next;
|
return (void *) next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +78,7 @@ qeth_get_router_str(struct qeth_card *card, int ipv)
|
||||||
{
|
{
|
||||||
int routing_type = 0;
|
int routing_type = 0;
|
||||||
|
|
||||||
if (ipv == 4){
|
if (ipv == 4) {
|
||||||
routing_type = card->options.route4.type;
|
routing_type = card->options.route4.type;
|
||||||
} else {
|
} else {
|
||||||
#ifdef CONFIG_QETH_IPV6
|
#ifdef CONFIG_QETH_IPV6
|
||||||
|
@ -154,6 +145,7 @@ qeth_procfile_seq_show(struct seq_file *s, void *it)
|
||||||
card->qdio.in_buf_pool.buf_count);
|
card->qdio.in_buf_pool.buf_count);
|
||||||
else
|
else
|
||||||
seq_printf(s, " +++ LAN OFFLINE +++\n");
|
seq_printf(s, " +++ LAN OFFLINE +++\n");
|
||||||
|
put_device(device);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -184,51 +176,16 @@ static struct file_operations qeth_procfile_fops = {
|
||||||
static struct proc_dir_entry *qeth_perf_procfile;
|
static struct proc_dir_entry *qeth_perf_procfile;
|
||||||
|
|
||||||
#ifdef CONFIG_QETH_PERF_STATS
|
#ifdef CONFIG_QETH_PERF_STATS
|
||||||
|
|
||||||
static void *
|
|
||||||
qeth_perf_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
|
||||||
{
|
|
||||||
struct device *dev = NULL;
|
|
||||||
int nr;
|
|
||||||
|
|
||||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
|
||||||
/* get card at pos *offset */
|
|
||||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
|
|
||||||
qeth_procfile_seq_match);
|
|
||||||
|
|
||||||
/* get card at pos *offset */
|
|
||||||
nr = *offset;
|
|
||||||
while (nr-- > 1 && dev)
|
|
||||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
|
|
||||||
NULL, qeth_procfile_seq_match);
|
|
||||||
return (void *) dev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
qeth_perf_procfile_seq_stop(struct seq_file *s, void* it)
|
|
||||||
{
|
|
||||||
up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
qeth_perf_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
|
|
||||||
{
|
|
||||||
struct device *prev, *next;
|
|
||||||
|
|
||||||
prev = (struct device *) it;
|
|
||||||
next = driver_find_device(&qeth_ccwgroup_driver.driver, prev,
|
|
||||||
NULL, qeth_procfile_seq_match);
|
|
||||||
if (next)
|
|
||||||
(*offset)++;
|
|
||||||
return (void *) next;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
|
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)
|
||||||
|
return 0;
|
||||||
|
|
||||||
device = (struct device *) it;
|
device = (struct device *) it;
|
||||||
card = device->driver_data;
|
card = device->driver_data;
|
||||||
seq_printf(s, "For card with devnos %s/%s/%s (%s):\n",
|
seq_printf(s, "For card with devnos %s/%s/%s (%s):\n",
|
||||||
|
@ -295,13 +252,14 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
|
||||||
card->perf_stats.outbound_do_qdio_time,
|
card->perf_stats.outbound_do_qdio_time,
|
||||||
card->perf_stats.outbound_do_qdio_cnt
|
card->perf_stats.outbound_do_qdio_cnt
|
||||||
);
|
);
|
||||||
|
put_device(device);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct seq_operations qeth_perf_procfile_seq_ops = {
|
static struct seq_operations qeth_perf_procfile_seq_ops = {
|
||||||
.start = qeth_perf_procfile_seq_start,
|
.start = qeth_procfile_seq_start,
|
||||||
.stop = qeth_perf_procfile_seq_stop,
|
.stop = qeth_procfile_seq_stop,
|
||||||
.next = qeth_perf_procfile_seq_next,
|
.next = qeth_procfile_seq_next,
|
||||||
.show = qeth_perf_procfile_seq_show,
|
.show = qeth_perf_procfile_seq_show,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -324,93 +282,6 @@ static struct file_operations qeth_perf_procfile_fops = {
|
||||||
#define qeth_perf_procfile_created 1
|
#define qeth_perf_procfile_created 1
|
||||||
#endif /* CONFIG_QETH_PERF_STATS */
|
#endif /* CONFIG_QETH_PERF_STATS */
|
||||||
|
|
||||||
/***** /proc/qeth_ipa_takeover *****/
|
|
||||||
#define QETH_IPATO_PROCFILE_NAME "qeth_ipa_takeover"
|
|
||||||
static struct proc_dir_entry *qeth_ipato_procfile;
|
|
||||||
|
|
||||||
static void *
|
|
||||||
qeth_ipato_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
|
||||||
{
|
|
||||||
struct device *dev;
|
|
||||||
loff_t nr;
|
|
||||||
|
|
||||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
|
||||||
/* TODO: finish this */
|
|
||||||
/*
|
|
||||||
* maybe SEQ_SATRT_TOKEN can be returned for offset 0
|
|
||||||
* output driver settings then;
|
|
||||||
* else output setting for respective card
|
|
||||||
*/
|
|
||||||
|
|
||||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, NULL, NULL,
|
|
||||||
qeth_procfile_seq_match);
|
|
||||||
|
|
||||||
/* get card at pos *offset */
|
|
||||||
nr = *offset;
|
|
||||||
while (nr-- > 1 && dev)
|
|
||||||
dev = driver_find_device(&qeth_ccwgroup_driver.driver, dev,
|
|
||||||
NULL, qeth_procfile_seq_match);
|
|
||||||
return (void *) dev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
qeth_ipato_procfile_seq_stop(struct seq_file *s, void* it)
|
|
||||||
{
|
|
||||||
up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
qeth_ipato_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
|
|
||||||
{
|
|
||||||
struct device *prev, *next;
|
|
||||||
|
|
||||||
prev = (struct device *) it;
|
|
||||||
next = driver_find_device(&qeth_ccwgroup_driver.driver, prev,
|
|
||||||
NULL, qeth_procfile_seq_match);
|
|
||||||
if (next)
|
|
||||||
(*offset)++;
|
|
||||||
return (void *) next;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
qeth_ipato_procfile_seq_show(struct seq_file *s, void *it)
|
|
||||||
{
|
|
||||||
struct device *device;
|
|
||||||
struct qeth_card *card;
|
|
||||||
|
|
||||||
/* TODO: finish this */
|
|
||||||
/*
|
|
||||||
* maybe SEQ_SATRT_TOKEN can be returned for offset 0
|
|
||||||
* output driver settings then;
|
|
||||||
* else output setting for respective card
|
|
||||||
*/
|
|
||||||
device = (struct device *) it;
|
|
||||||
card = device->driver_data;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct seq_operations qeth_ipato_procfile_seq_ops = {
|
|
||||||
.start = qeth_ipato_procfile_seq_start,
|
|
||||||
.stop = qeth_ipato_procfile_seq_stop,
|
|
||||||
.next = qeth_ipato_procfile_seq_next,
|
|
||||||
.show = qeth_ipato_procfile_seq_show,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int
|
|
||||||
qeth_ipato_procfile_open(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
return seq_open(file, &qeth_ipato_procfile_seq_ops);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct file_operations qeth_ipato_procfile_fops = {
|
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.open = qeth_ipato_procfile_open,
|
|
||||||
.read = seq_read,
|
|
||||||
.llseek = seq_lseek,
|
|
||||||
.release = seq_release,
|
|
||||||
};
|
|
||||||
|
|
||||||
int __init
|
int __init
|
||||||
qeth_create_procfs_entries(void)
|
qeth_create_procfs_entries(void)
|
||||||
{
|
{
|
||||||
|
@ -426,13 +297,7 @@ qeth_create_procfs_entries(void)
|
||||||
qeth_perf_procfile->proc_fops = &qeth_perf_procfile_fops;
|
qeth_perf_procfile->proc_fops = &qeth_perf_procfile_fops;
|
||||||
#endif /* CONFIG_QETH_PERF_STATS */
|
#endif /* CONFIG_QETH_PERF_STATS */
|
||||||
|
|
||||||
qeth_ipato_procfile = create_proc_entry(QETH_IPATO_PROCFILE_NAME,
|
|
||||||
S_IFREG | 0444, NULL);
|
|
||||||
if (qeth_ipato_procfile)
|
|
||||||
qeth_ipato_procfile->proc_fops = &qeth_ipato_procfile_fops;
|
|
||||||
|
|
||||||
if (qeth_procfile &&
|
if (qeth_procfile &&
|
||||||
qeth_ipato_procfile &&
|
|
||||||
qeth_perf_procfile_created)
|
qeth_perf_procfile_created)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
|
@ -446,62 +311,5 @@ qeth_remove_procfs_entries(void)
|
||||||
remove_proc_entry(QETH_PROCFILE_NAME, NULL);
|
remove_proc_entry(QETH_PROCFILE_NAME, NULL);
|
||||||
if (qeth_perf_procfile)
|
if (qeth_perf_procfile)
|
||||||
remove_proc_entry(QETH_PERF_PROCFILE_NAME, NULL);
|
remove_proc_entry(QETH_PERF_PROCFILE_NAME, NULL);
|
||||||
if (qeth_ipato_procfile)
|
|
||||||
remove_proc_entry(QETH_IPATO_PROCFILE_NAME, NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ONLY FOR DEVELOPMENT! -> make it as module */
|
|
||||||
/*
|
|
||||||
static void
|
|
||||||
qeth_create_sysfs_entries(void)
|
|
||||||
{
|
|
||||||
struct device *dev;
|
|
||||||
|
|
||||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
|
||||||
|
|
||||||
list_for_each_entry(dev, &qeth_ccwgroup_driver.driver.devices,
|
|
||||||
driver_list)
|
|
||||||
qeth_create_device_attributes(dev);
|
|
||||||
|
|
||||||
up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
qeth_remove_sysfs_entries(void)
|
|
||||||
{
|
|
||||||
struct device *dev;
|
|
||||||
|
|
||||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
|
||||||
|
|
||||||
list_for_each_entry(dev, &qeth_ccwgroup_driver.driver.devices,
|
|
||||||
driver_list)
|
|
||||||
qeth_remove_device_attributes(dev);
|
|
||||||
|
|
||||||
up_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init
|
|
||||||
qeth_fs_init(void)
|
|
||||||
{
|
|
||||||
printk(KERN_INFO "qeth_fs_init\n");
|
|
||||||
qeth_create_procfs_entries();
|
|
||||||
qeth_create_sysfs_entries();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __exit
|
|
||||||
qeth_fs_exit(void)
|
|
||||||
{
|
|
||||||
printk(KERN_INFO "qeth_fs_exit\n");
|
|
||||||
qeth_remove_procfs_entries();
|
|
||||||
qeth_remove_sysfs_entries();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
module_init(qeth_fs_init);
|
|
||||||
module_exit(qeth_fs_exit);
|
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
|
||||||
*/
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* linux/drivers/s390/net/qeth_sys.c ($Revision: 1.58 $)
|
* linux/drivers/s390/net/qeth_sys.c ($Revision: 1.60 $)
|
||||||
*
|
*
|
||||||
* Linux on zSeries OSA Express and HiperSockets support
|
* Linux on zSeries OSA Express and HiperSockets support
|
||||||
* This file contains code related to sysfs.
|
* This file contains code related to sysfs.
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
#include "qeth_mpc.h"
|
#include "qeth_mpc.h"
|
||||||
#include "qeth_fs.h"
|
#include "qeth_fs.h"
|
||||||
|
|
||||||
const char *VERSION_QETH_SYS_C = "$Revision: 1.58 $";
|
const char *VERSION_QETH_SYS_C = "$Revision: 1.60 $";
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* */
|
/* */
|
||||||
|
@ -160,7 +160,7 @@ qeth_dev_portname_store(struct device *dev, struct device_attribute *attr, const
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
tmp = strsep((char **) &buf, "\n");
|
tmp = strsep((char **) &buf, "\n");
|
||||||
if ((strlen(tmp) > 8) || (strlen(tmp) < 2))
|
if ((strlen(tmp) > 8) || (strlen(tmp) == 0))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
card->info.portname[0] = strlen(tmp);
|
card->info.portname[0] = strlen(tmp);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* linux/drivers/s390/net/qeth_tso.h ($Revision: 1.7 $)
|
* linux/drivers/s390/net/qeth_tso.h ($Revision: 1.8 $)
|
||||||
*
|
*
|
||||||
* Header file for qeth TCP Segmentation Offload support.
|
* Header file for qeth TCP Segmentation Offload support.
|
||||||
*
|
*
|
||||||
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
* Author(s): Frank Pavlic <fpavlic@de.ibm.com>
|
* Author(s): Frank Pavlic <fpavlic@de.ibm.com>
|
||||||
*
|
*
|
||||||
* $Revision: 1.7 $ $Date: 2005/05/04 20:19:18 $
|
* $Revision: 1.8 $ $Date: 2005/05/04 20:19:18 $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifndef __QETH_TSO_H__
|
#ifndef __QETH_TSO_H__
|
||||||
|
|
Loading…
Reference in a new issue