Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
05c5f695
Commit
05c5f695
authored
Jan 06, 2005
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge pobox.com:/garz/repo/netdev-2.6/sk98lin
into pobox.com:/garz/repo/net-drivers-2.6
parents
87475e1f
82cd9a70
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
845 additions
and
431 deletions
+845
-431
drivers/net/sk98lin/Makefile
drivers/net/sk98lin/Makefile
+1
-0
drivers/net/sk98lin/h/skdrv2nd.h
drivers/net/sk98lin/h/skdrv2nd.h
+3
-2
drivers/net/sk98lin/skaddr.c
drivers/net/sk98lin/skaddr.c
+1
-1
drivers/net/sk98lin/skethtool.c
drivers/net/sk98lin/skethtool.c
+555
-0
drivers/net/sk98lin/skge.c
drivers/net/sk98lin/skge.c
+125
-155
drivers/net/sk98lin/skproc.c
drivers/net/sk98lin/skproc.c
+160
-273
No files found.
drivers/net/sk98lin/Makefile
View file @
05c5f695
...
...
@@ -13,6 +13,7 @@
obj-$(CONFIG_SK98LIN)
+=
sk98lin.o
sk98lin-objs
:=
\
skge.o
\
skethtool.o
\
skdim.o
\
skaddr.o
\
skgehwt.o
\
...
...
drivers/net/sk98lin/h/skdrv2nd.h
View file @
05c5f695
...
...
@@ -266,7 +266,6 @@ struct s_TxD {
typedef
struct
s_DevNet
DEV_NET
;
struct
s_DevNet
{
struct
proc_dir_entry
*
proc
;
int
PortNr
;
int
NetNr
;
int
Mtu
;
...
...
@@ -383,6 +382,8 @@ struct s_AC {
SK_CSUM
Csum
;
/* for checksum module */
SK_RLMT
Rlmt
;
/* for rlmt module */
spinlock_t
SlowPathLock
;
/* Normal IRQ lock */
struct
timer_list
BlinkTimer
;
/* for LED blinking */
int
LedsOn
;
SK_PNMI_STRUCT_DATA
PnmiStruct
;
/* structure to get all Pnmi-Data */
int
RlmtMode
;
/* link check mode to set */
int
RlmtNets
;
/* Number of nets */
...
...
@@ -395,7 +396,7 @@ struct s_AC {
SK_U32
PciDevId
;
/* pci device id */
struct
SK_NET_DEVICE
*
dev
[
2
];
/* pointer to device struct */
char
Name
[
30
];
/* driver name */
struct
SK_NET_DEVICE
*
Next
;
/* link all devices (for clearing) */
int
RxBufSize
;
/* length of receive buffers */
struct
net_device_stats
stats
;
/* linux 'netstat -i' statistics */
int
Index
;
/* internal board index number */
...
...
drivers/net/sk98lin/skaddr.c
View file @
05c5f695
...
...
@@ -79,7 +79,7 @@ extern "C" {
/* 64-bit hash values with all bits set. */
SK_U16
OnesHash
[
4
]
=
{
0xFFFF
,
0xFFFF
,
0xFFFF
,
0xFFFF
};
static
const
SK_U16
OnesHash
[
4
]
=
{
0xFFFF
,
0xFFFF
,
0xFFFF
,
0xFFFF
};
/* local variables ************************************************************/
...
...
drivers/net/sk98lin/skethtool.c
0 → 100644
View file @
05c5f695
/******************************************************************************
*
* Name: skethtool.c
* Project: GEnesis, PCI Gigabit Ethernet Adapter
* Version: $Revision: 1.7 $
* Date: $Date: 2004/09/29 13:32:07 $
* Purpose: All functions regarding ethtool handling
*
******************************************************************************/
/******************************************************************************
*
* (C)Copyright 1998-2002 SysKonnect GmbH.
* (C)Copyright 2002-2004 Marvell.
*
* Driver for Marvell Yukon/2 chipset and SysKonnect Gigabit Ethernet
* Server Adapters.
*
* Author: Ralph Roesler (rroesler@syskonnect.de)
* Mirko Lindner (mlindner@syskonnect.de)
*
* Address all question to: linux@syskonnect.de
*
* The technical manual for the adapters is available from SysKonnect's
* web pages: www.syskonnect.com
*
* 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* The information in this file is provided "AS IS" without warranty.
*
*****************************************************************************/
#include "h/skdrv1st.h"
#include "h/skdrv2nd.h"
#include "h/skversion.h"
#include <linux/ethtool.h>
#include <linux/timer.h>
#include <linux/delay.h>
/******************************************************************************
*
* Defines
*
*****************************************************************************/
#define SUPP_COPPER_ALL (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | \
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full | \
SUPPORTED_1000baseT_Half| SUPPORTED_1000baseT_Full| \
SUPPORTED_TP)
#define ADV_COPPER_ALL (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | \
ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | \
ADVERTISED_1000baseT_Half| ADVERTISED_1000baseT_Full| \
ADVERTISED_TP)
#define SUPP_FIBRE_ALL (SUPPORTED_1000baseT_Full | \
SUPPORTED_FIBRE | \
SUPPORTED_Autoneg)
#define ADV_FIBRE_ALL (ADVERTISED_1000baseT_Full | \
ADVERTISED_FIBRE | \
ADVERTISED_Autoneg)
/******************************************************************************
*
* Local Functions
*
*****************************************************************************/
/*****************************************************************************
*
* getSettings - retrieves the current settings of the selected adapter
*
* Description:
* The current configuration of the selected adapter is returned.
* This configuration involves a)speed, b)duplex and c)autoneg plus
* a number of other variables.
*
* Returns: always 0
*
*/
static
int
getSettings
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
ecmd
)
{
const
DEV_NET
*
pNet
=
netdev_priv
(
dev
);
int
port
=
pNet
->
PortNr
;
const
SK_AC
*
pAC
=
pNet
->
pAC
;
const
SK_GEPORT
*
pPort
=
&
pAC
->
GIni
.
GP
[
port
];
static
int
DuplexAutoNegConfMap
[
9
][
3
]
=
{
{
-
1
,
-
1
,
-
1
},
{
0
,
-
1
,
-
1
},
{
SK_LMODE_HALF
,
DUPLEX_HALF
,
AUTONEG_DISABLE
},
{
SK_LMODE_FULL
,
DUPLEX_FULL
,
AUTONEG_DISABLE
},
{
SK_LMODE_AUTOHALF
,
DUPLEX_HALF
,
AUTONEG_ENABLE
},
{
SK_LMODE_AUTOFULL
,
DUPLEX_FULL
,
AUTONEG_ENABLE
},
{
SK_LMODE_AUTOBOTH
,
DUPLEX_FULL
,
AUTONEG_ENABLE
},
{
SK_LMODE_AUTOSENSE
,
-
1
,
-
1
},
{
SK_LMODE_INDETERMINATED
,
-
1
,
-
1
}
};
static
int
SpeedConfMap
[
6
][
2
]
=
{
{
0
,
-
1
},
{
SK_LSPEED_AUTO
,
-
1
},
{
SK_LSPEED_10MBPS
,
SPEED_10
},
{
SK_LSPEED_100MBPS
,
SPEED_100
},
{
SK_LSPEED_1000MBPS
,
SPEED_1000
},
{
SK_LSPEED_INDETERMINATED
,
-
1
}
};
static
int
AdvSpeedMap
[
6
][
2
]
=
{
{
0
,
-
1
},
{
SK_LSPEED_AUTO
,
-
1
},
{
SK_LSPEED_10MBPS
,
ADVERTISED_10baseT_Half
|
ADVERTISED_10baseT_Full
},
{
SK_LSPEED_100MBPS
,
ADVERTISED_100baseT_Half
|
ADVERTISED_100baseT_Full
},
{
SK_LSPEED_1000MBPS
,
ADVERTISED_1000baseT_Half
|
ADVERTISED_1000baseT_Full
},
{
SK_LSPEED_INDETERMINATED
,
-
1
}
};
ecmd
->
phy_address
=
port
;
ecmd
->
speed
=
SpeedConfMap
[
pPort
->
PLinkSpeedUsed
][
1
];
ecmd
->
duplex
=
DuplexAutoNegConfMap
[
pPort
->
PLinkModeStatus
][
1
];
ecmd
->
autoneg
=
DuplexAutoNegConfMap
[
pPort
->
PLinkModeStatus
][
2
];
ecmd
->
transceiver
=
XCVR_INTERNAL
;
if
(
pAC
->
GIni
.
GICopperType
)
{
ecmd
->
port
=
PORT_TP
;
ecmd
->
supported
=
(
SUPP_COPPER_ALL
|
SUPPORTED_Autoneg
);
if
(
pAC
->
GIni
.
GIGenesis
)
{
ecmd
->
supported
&=
~
(
SUPPORTED_10baseT_Half
);
ecmd
->
supported
&=
~
(
SUPPORTED_10baseT_Full
);
ecmd
->
supported
&=
~
(
SUPPORTED_100baseT_Half
);
ecmd
->
supported
&=
~
(
SUPPORTED_100baseT_Full
);
}
else
{
if
(
pAC
->
GIni
.
GIChipId
==
CHIP_ID_YUKON
)
{
ecmd
->
supported
&=
~
(
SUPPORTED_1000baseT_Half
);
}
#ifdef CHIP_ID_YUKON_FE
if
(
pAC
->
GIni
.
GIChipId
==
CHIP_ID_YUKON_FE
)
{
ecmd
->
supported
&=
~
(
SUPPORTED_1000baseT_Half
);
ecmd
->
supported
&=
~
(
SUPPORTED_1000baseT_Full
);
}
#endif
}
if
(
pAC
->
GIni
.
GP
[
0
].
PLinkSpeed
!=
SK_LSPEED_AUTO
)
{
ecmd
->
advertising
=
AdvSpeedMap
[
pPort
->
PLinkSpeed
][
1
];
if
(
pAC
->
GIni
.
GIChipId
==
CHIP_ID_YUKON
)
{
ecmd
->
advertising
&=
~
(
SUPPORTED_1000baseT_Half
);
}
}
else
{
ecmd
->
advertising
=
ecmd
->
supported
;
}
if
(
ecmd
->
autoneg
==
AUTONEG_ENABLE
)
ecmd
->
advertising
|=
ADVERTISED_Autoneg
;
}
else
{
ecmd
->
port
=
PORT_FIBRE
;
ecmd
->
supported
=
SUPP_FIBRE_ALL
;
ecmd
->
advertising
=
ADV_FIBRE_ALL
;
}
return
0
;
}
/*
* MIB infrastructure uses instance value starting at 1
* based on board and port.
*/
static
inline
u32
pnmiInstance
(
const
DEV_NET
*
pNet
)
{
return
1
+
(
pNet
->
pAC
->
RlmtNets
==
2
)
+
pNet
->
PortNr
;
}
/*****************************************************************************
*
* setSettings - configures the settings of a selected adapter
*
* Description:
* Possible settings that may be altered are a)speed, b)duplex or
* c)autonegotiation.
*
* Returns:
* 0: everything fine, no error
* <0: the return value is the error code of the failure
*/
static
int
setSettings
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
ecmd
)
{
DEV_NET
*
pNet
=
netdev_priv
(
dev
);
SK_AC
*
pAC
=
pNet
->
pAC
;
u32
instance
;
char
buf
[
4
];
int
len
=
1
;
if
(
ecmd
->
speed
!=
SPEED_10
&&
ecmd
->
speed
!=
SPEED_100
&&
ecmd
->
speed
!=
SPEED_1000
)
return
-
EINVAL
;
if
(
ecmd
->
duplex
!=
DUPLEX_HALF
&&
ecmd
->
duplex
!=
DUPLEX_FULL
)
return
-
EINVAL
;
if
(
ecmd
->
autoneg
!=
AUTONEG_DISABLE
&&
ecmd
->
autoneg
!=
AUTONEG_ENABLE
)
return
-
EINVAL
;
if
(
ecmd
->
autoneg
==
AUTONEG_DISABLE
)
*
buf
=
(
ecmd
->
duplex
==
DUPLEX_FULL
)
?
SK_LMODE_FULL
:
SK_LMODE_HALF
;
else
*
buf
=
(
ecmd
->
duplex
==
DUPLEX_FULL
)
?
SK_LMODE_AUTOFULL
:
SK_LMODE_AUTOHALF
;
instance
=
pnmiInstance
(
pNet
);
if
(
SkPnmiSetVar
(
pAC
,
pAC
->
IoBase
,
OID_SKGE_LINK_MODE
,
&
buf
,
&
len
,
instance
,
pNet
->
NetNr
)
!=
SK_PNMI_ERR_OK
)
return
-
EINVAL
;
switch
(
ecmd
->
speed
)
{
case
SPEED_1000
:
*
buf
=
SK_LSPEED_1000MBPS
;
break
;
case
SPEED_100
:
*
buf
=
SK_LSPEED_100MBPS
;
break
;
case
SPEED_10
:
*
buf
=
SK_LSPEED_10MBPS
;
}
if
(
SkPnmiSetVar
(
pAC
,
pAC
->
IoBase
,
OID_SKGE_SPEED_MODE
,
&
buf
,
&
len
,
instance
,
pNet
->
NetNr
)
!=
SK_PNMI_ERR_OK
)
return
-
EINVAL
;
return
0
;
}
/*****************************************************************************
*
* getDriverInfo - returns generic driver and adapter information
*
* Description:
* Generic driver information is returned via this function, such as
* the name of the driver, its version and and firmware version.
* In addition to this, the location of the selected adapter is
* returned as a bus info string (e.g. '01:05.0').
*
* Returns: N/A
*
*/
static
void
getDriverInfo
(
struct
net_device
*
dev
,
struct
ethtool_drvinfo
*
info
)
{
const
DEV_NET
*
pNet
=
netdev_priv
(
dev
);
const
SK_AC
*
pAC
=
pNet
->
pAC
;
char
vers
[
32
];
snprintf
(
vers
,
sizeof
(
vers
)
-
1
,
VER_STRING
"(v%d.%d)"
,
(
pAC
->
GIni
.
GIPciHwRev
>>
4
)
&
0xf
,
pAC
->
GIni
.
GIPciHwRev
&
0xf
);
strlcpy
(
info
->
driver
,
DRIVER_FILE_NAME
,
sizeof
(
info
->
driver
));
strcpy
(
info
->
version
,
vers
);
strcpy
(
info
->
fw_version
,
"N/A"
);
strlcpy
(
info
->
bus_info
,
pAC
->
PciDev
->
slot_name
,
ETHTOOL_BUSINFO_LEN
);
}
/*
* Ethtool statistics support.
*/
static
const
char
StringsStats
[][
ETH_GSTRING_LEN
]
=
{
"rx_packets"
,
"tx_packets"
,
"rx_bytes"
,
"tx_bytes"
,
"rx_errors"
,
"tx_errors"
,
"rx_dropped"
,
"tx_dropped"
,
"multicasts"
,
"collisions"
,
"rx_length_errors"
,
"rx_buffer_overflow_errors"
,
"rx_crc_errors"
,
"rx_frame_errors"
,
"rx_too_short_errors"
,
"rx_too_long_errors"
,
"rx_carrier_extension_errors"
,
"rx_symbol_errors"
,
"rx_llc_mac_size_errors"
,
"rx_carrier_errors"
,
"rx_jabber_errors"
,
"rx_missed_errors"
,
"tx_abort_collision_errors"
,
"tx_carrier_errors"
,
"tx_buffer_underrun_errors"
,
"tx_heartbeat_errors"
,
"tx_window_errors"
,
};
static
int
getStatsCount
(
struct
net_device
*
dev
)
{
return
ARRAY_SIZE
(
StringsStats
);
}
static
void
getStrings
(
struct
net_device
*
dev
,
u32
stringset
,
u8
*
data
)
{
switch
(
stringset
)
{
case
ETH_SS_STATS
:
memcpy
(
data
,
*
StringsStats
,
sizeof
(
StringsStats
));
break
;
}
}
static
void
getEthtoolStats
(
struct
net_device
*
dev
,
struct
ethtool_stats
*
stats
,
u64
*
data
)
{
const
DEV_NET
*
pNet
=
netdev_priv
(
dev
);
const
SK_AC
*
pAC
=
pNet
->
pAC
;
const
SK_PNMI_STRUCT_DATA
*
pPnmiStruct
=
&
pAC
->
PnmiStruct
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxOkCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatTxOkCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxOctetsOkCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatTxOctetsOkCts
;
*
data
++
=
pPnmiStruct
->
InErrorsCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatTxSingleCollisionCts
;
*
data
++
=
pPnmiStruct
->
RxNoBufCts
;
*
data
++
=
pPnmiStruct
->
TxNoBufCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxMulticastOkCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatTxSingleCollisionCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxRuntCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxFifoOverflowCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxFcsCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxFramingCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxShortsCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxTooLongCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxCextCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxSymbolCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxIRLengthCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxCarrierCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxJabberCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatRxMissedCts
;
*
data
++
=
pAC
->
stats
.
tx_aborted_errors
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatTxCarrierCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatTxFifoUnderrunCts
;
*
data
++
=
pPnmiStruct
->
Stat
[
0
].
StatTxCarrierCts
;
*
data
++
=
pAC
->
stats
.
tx_window_errors
;
}
/*****************************************************************************
*
* toggleLeds - Changes the LED state of an adapter
*
* Description:
* This function changes the current state of all LEDs of an adapter so
* that it can be located by a user.
*
* Returns: N/A
*
*/
static
void
toggleLeds
(
DEV_NET
*
pNet
,
int
on
)
{
SK_AC
*
pAC
=
pNet
->
pAC
;
int
port
=
pNet
->
PortNr
;
void
__iomem
*
io
=
pAC
->
IoBase
;
if
(
pAC
->
GIni
.
GIGenesis
)
{
SK_OUT8
(
io
,
MR_ADDR
(
port
,
LNK_LED_REG
),
on
?
SK_LNK_ON
:
SK_LNK_OFF
);
SkGeYellowLED
(
pAC
,
io
,
on
?
(
LED_ON
>>
1
)
:
(
LED_OFF
>>
1
));
SkGeXmitLED
(
pAC
,
io
,
MR_ADDR
(
port
,
RX_LED_INI
),
on
?
SK_LED_TST
:
SK_LED_DIS
);
if
(
pAC
->
GIni
.
GP
[
port
].
PhyType
==
SK_PHY_BCOM
)
SkXmPhyWrite
(
pAC
,
io
,
port
,
PHY_BCOM_P_EXT_CTRL
,
on
?
PHY_B_PEC_LED_ON
:
PHY_B_PEC_LED_OFF
);
else
if
(
pAC
->
GIni
.
GP
[
port
].
PhyType
==
SK_PHY_LONE
)
SkXmPhyWrite
(
pAC
,
io
,
port
,
PHY_LONE_LED_CFG
,
on
?
0x0800
:
PHY_L_LC_LEDT
);
else
SkGeXmitLED
(
pAC
,
io
,
MR_ADDR
(
port
,
TX_LED_INI
),
on
?
SK_LED_TST
:
SK_LED_DIS
);
}
else
{
const
u16
YukLedOn
=
(
PHY_M_LED_MO_DUP
(
MO_LED_ON
)
|
PHY_M_LED_MO_10
(
MO_LED_ON
)
|
PHY_M_LED_MO_100
(
MO_LED_ON
)
|
PHY_M_LED_MO_1000
(
MO_LED_ON
)
|
PHY_M_LED_MO_RX
(
MO_LED_ON
));
const
u16
YukLedOff
=
(
PHY_M_LED_MO_DUP
(
MO_LED_OFF
)
|
PHY_M_LED_MO_10
(
MO_LED_OFF
)
|
PHY_M_LED_MO_100
(
MO_LED_OFF
)
|
PHY_M_LED_MO_1000
(
MO_LED_OFF
)
|
PHY_M_LED_MO_RX
(
MO_LED_OFF
));
SkGmPhyWrite
(
pAC
,
io
,
port
,
PHY_MARV_LED_CTRL
,
0
);
SkGmPhyWrite
(
pAC
,
io
,
port
,
PHY_MARV_LED_OVER
,
on
?
YukLedOn
:
YukLedOff
);
}
}
/*****************************************************************************
*
* skGeBlinkTimer - Changes the LED state of an adapter
*
* Description:
* This function changes the current state of all LEDs of an adapter so
* that it can be located by a user. If the requested time interval for
* this test has elapsed, this function cleans up everything that was
* temporarily setup during the locate NIC test. This involves of course
* also closing or opening any adapter so that the initial board state
* is recovered.
*
* Returns: N/A
*
*/
void
SkGeBlinkTimer
(
unsigned
long
data
)
{
struct
net_device
*
dev
=
(
struct
net_device
*
)
data
;
DEV_NET
*
pNet
=
netdev_priv
(
dev
);
SK_AC
*
pAC
=
pNet
->
pAC
;
toggleLeds
(
pNet
,
pAC
->
LedsOn
);
pAC
->
LedsOn
=
!
pAC
->
LedsOn
;
mod_timer
(
&
pAC
->
BlinkTimer
,
jiffies
+
HZ
/
4
);
}
/*****************************************************************************
*
* locateDevice - start the locate NIC feature of the elected adapter
*
* Description:
* This function is used if the user want to locate a particular NIC.
* All LEDs are regularly switched on and off, so the NIC can easily
* be identified.
*
* Returns:
* ==0: everything fine, no error, locateNIC test was started
* !=0: one locateNIC test runs already
*
*/
static
int
locateDevice
(
struct
net_device
*
dev
,
u32
data
)
{
DEV_NET
*
pNet
=
netdev_priv
(
dev
);
SK_AC
*
pAC
=
pNet
->
pAC
;
if
(
!
data
||
data
>
(
u32
)(
MAX_SCHEDULE_TIMEOUT
/
HZ
))
data
=
(
u32
)(
MAX_SCHEDULE_TIMEOUT
/
HZ
);
/* start blinking */
pAC
->
LedsOn
=
0
;
mod_timer
(
&
pAC
->
BlinkTimer
,
jiffies
);
msleep_interruptible
(
data
*
1000
);
set_current_state
(
TASK_INTERRUPTIBLE
);
schedule_timeout
(
data
*
HZ
);
del_timer_sync
(
&
pAC
->
BlinkTimer
);
toggleLeds
(
pNet
,
0
);
return
0
;
}
/*****************************************************************************
*
* getPauseParams - retrieves the pause parameters
*
* Description:
* All current pause parameters of a selected adapter are placed
* in the passed ethtool_pauseparam structure and are returned.
*
* Returns: N/A
*
*/
static
void
getPauseParams
(
struct
net_device
*
dev
,
struct
ethtool_pauseparam
*
epause
)
{
DEV_NET
*
pNet
=
netdev_priv
(
dev
);
SK_AC
*
pAC
=
pNet
->
pAC
;
SK_GEPORT
*
pPort
=
&
pAC
->
GIni
.
GP
[
pNet
->
PortNr
];
epause
->
rx_pause
=
(
pPort
->
PFlowCtrlMode
==
SK_FLOW_MODE_SYMMETRIC
)
||
(
pPort
->
PFlowCtrlMode
==
SK_FLOW_MODE_SYM_OR_REM
);
epause
->
tx_pause
=
epause
->
rx_pause
||
(
pPort
->
PFlowCtrlMode
==
SK_FLOW_MODE_LOC_SEND
);
epause
->
autoneg
=
epause
->
rx_pause
||
epause
->
tx_pause
;
}
/*****************************************************************************
*
* setPauseParams - configures the pause parameters of an adapter
*
* Description:
* This function sets the Rx or Tx pause parameters
*
* Returns:
* ==0: everything fine, no error
* !=0: the return value is the error code of the failure
*/
static
int
setPauseParams
(
struct
net_device
*
dev
,
struct
ethtool_pauseparam
*
epause
)
{
DEV_NET
*
pNet
=
netdev_priv
(
dev
);
SK_AC
*
pAC
=
pNet
->
pAC
;
SK_GEPORT
*
pPort
=
&
pAC
->
GIni
.
GP
[
pNet
->
PortNr
];
u32
instance
=
pnmiInstance
(
pNet
);
struct
ethtool_pauseparam
old
;
u8
oldspeed
=
pPort
->
PLinkSpeedUsed
;
char
buf
[
4
];
int
len
=
1
;
int
ret
;
/*
** we have to determine the current settings to see if
** the operator requested any modification of the flow
** control parameters...
*/
getPauseParams
(
dev
,
&
old
);
/*
** perform modifications regarding the changes
** requested by the operator
*/
if
(
epause
->
autoneg
!=
old
.
autoneg
)
*
buf
=
epause
->
autoneg
?
SK_FLOW_MODE_NONE
:
SK_FLOW_MODE_SYMMETRIC
;
else
{
if
(
epause
->
rx_pause
&&
epause
->
tx_pause
)
*
buf
=
SK_FLOW_MODE_SYMMETRIC
;
else
if
(
epause
->
rx_pause
&&
!
epause
->
tx_pause
)
*
buf
=
SK_FLOW_MODE_SYM_OR_REM
;
else
if
(
!
epause
->
rx_pause
&&
epause
->
tx_pause
)
*
buf
=
SK_FLOW_MODE_LOC_SEND
;
else
*
buf
=
SK_FLOW_MODE_NONE
;
}
ret
=
SkPnmiSetVar
(
pAC
,
pAC
->
IoBase
,
OID_SKGE_FLOWCTRL_MODE
,
&
buf
,
&
len
,
instance
,
pNet
->
NetNr
);
if
(
ret
!=
SK_PNMI_ERR_OK
)
{
SK_DBG_MSG
(
NULL
,
SK_DBGMOD_DRV
,
SK_DBGCAT_CTRL
,
(
"ethtool (sk98lin): error changing rx/tx pause (%i)
\n
"
,
ret
));
goto
err
;
}
/*
** It may be that autoneg has been disabled! Therefore
** set the speed to the previously used value...
*/
if
(
!
epause
->
autoneg
)
{
len
=
1
;
ret
=
SkPnmiSetVar
(
pAC
,
pAC
->
IoBase
,
OID_SKGE_SPEED_MODE
,
&
oldspeed
,
&
len
,
instance
,
pNet
->
NetNr
);
if
(
ret
!=
SK_PNMI_ERR_OK
)
SK_DBG_MSG
(
NULL
,
SK_DBGMOD_DRV
,
SK_DBGCAT_CTRL
,
(
"ethtool (sk98lin): error setting speed (%i)
\n
"
,
ret
));
}
err:
return
ret
?
-
EIO
:
0
;
}
struct
ethtool_ops
SkGeEthtoolOps
=
{
.
get_settings
=
getSettings
,
.
set_settings
=
setSettings
,
.
get_drvinfo
=
getDriverInfo
,
.
get_strings
=
getStrings
,
.
get_stats_count
=
getStatsCount
,
.
get_ethtool_stats
=
getEthtoolStats
,
.
phys_id
=
locateDevice
,
.
get_pauseparam
=
getPauseParams
,
.
set_pauseparam
=
setPauseParams
,
};
drivers/net/sk98lin/skge.c
View file @
05c5f695
...
...
@@ -109,6 +109,7 @@
#include "h/skversion.h"
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
...
...
@@ -233,17 +234,33 @@ static int SkDrvDeInitAdapter(SK_AC *pAC, int devNbr);
* Extern Function Prototypes
*
******************************************************************************/
#ifdef CONFIG_PROC_FS
static
const
char
SK_Root_Dir_entry
[]
=
"sk98lin"
;
static
const
char
SKRootName
[]
=
"sk98lin"
;
static
struct
proc_dir_entry
*
pSkRootDir
;
extern
struct
file_operations
sk_proc_fops
;
#endif
static
inline
void
SkGeProcCreate
(
struct
net_device
*
dev
)
{
struct
proc_dir_entry
*
pe
;
if
(
pSkRootDir
&&
(
pe
=
create_proc_entry
(
dev
->
name
,
S_IRUGO
,
pSkRootDir
)))
{
pe
->
proc_fops
=
&
sk_proc_fops
;
pe
->
data
=
dev
;
pe
->
owner
=
THIS_MODULE
;
}
}
static
inline
void
SkGeProcRemove
(
struct
net_device
*
dev
)
{
if
(
pSkRootDir
)
remove_proc_entry
(
dev
->
name
,
pSkRootDir
);
}
extern
void
SkDimEnableModerationIfNeeded
(
SK_AC
*
pAC
);
extern
void
SkDimDisplayModerationSettings
(
SK_AC
*
pAC
);
extern
void
SkDimStartModerationTimer
(
SK_AC
*
pAC
);
extern
void
SkDimModerate
(
SK_AC
*
pAC
);
extern
void
SkGeBlinkTimer
(
unsigned
long
data
);
#ifdef DEBUG
static
void
DumpMsg
(
struct
sk_buff
*
,
char
*
);
...
...
@@ -252,8 +269,8 @@ static void DumpLong(char*, int);
#endif
/* global variables *********************************************************/
struct
SK_NET_DEVICE
*
SkGeRootDev
=
NULL
;
static
SK_BOOL
DoPrintInterfaceChange
=
SK_TRUE
;
extern
struct
ethtool_ops
SkGeEthtoolOps
;
/* local variables **********************************************************/
static
uintptr_t
TxQueueAddr
[
SK_MAX_MACS
][
2
]
=
{{
0x680
,
0x600
},{
0x780
,
0x700
}};
...
...
@@ -337,22 +354,20 @@ SK_U32 AllocFlag;
DEV_NET
*
pNet
;
SK_AC
*
pAC
;
if
(
dev
->
priv
)
{
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pAC
=
pNet
->
pAC
;
AllocFlag
=
pAC
->
AllocFlag
;
if
(
pAC
->
PciDev
)
{
pci_release_regions
(
pAC
->
PciDev
);
}
if
(
AllocFlag
&
SK_ALLOC_IRQ
)
{
free_irq
(
dev
->
irq
,
dev
);
}
if
(
pAC
->
IoBase
)
{
iounmap
(
pAC
->
IoBase
);
}
if
(
pAC
->
pDescrMem
)
{
BoardFreeMem
(
pAC
);
}
pNet
=
netdev_priv
(
dev
);
pAC
=
pNet
->
pAC
;
AllocFlag
=
pAC
->
AllocFlag
;
if
(
pAC
->
PciDev
)
{
pci_release_regions
(
pAC
->
PciDev
);
}
if
(
AllocFlag
&
SK_ALLOC_IRQ
)
{
free_irq
(
dev
->
irq
,
dev
);
}
if
(
pAC
->
IoBase
)
{
iounmap
(
pAC
->
IoBase
);
}
if
(
pAC
->
pDescrMem
)
{
BoardFreeMem
(
pAC
);
}
}
/* FreeResources */
...
...
@@ -360,26 +375,6 @@ SK_AC *pAC;
MODULE_AUTHOR
(
"Mirko Lindner <mlindner@syskonnect.de>"
);
MODULE_DESCRIPTION
(
"SysKonnect SK-NET Gigabit Ethernet SK-98xx driver"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_PARM
(
Speed_A
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
Speed_B
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
AutoNeg_A
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
AutoNeg_B
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
DupCap_A
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
DupCap_B
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
FlowCtrl_A
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
FlowCtrl_B
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
Role_A
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
Role_B
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
ConType
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
PrefPort
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
RlmtMode
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
/* used for interrupt moderation */
MODULE_PARM
(
IntsPerSec
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"i"
);
MODULE_PARM
(
Moderation
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
Stats
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
ModerationMask
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
MODULE_PARM
(
AutoSizing
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"s"
);
#ifdef LINK_SPEED_A
static
char
*
Speed_A
[
SK_MAX_CARD_PARAM
]
=
LINK_SPEED
;
...
...
@@ -465,6 +460,26 @@ static char *ModerationMask[SK_MAX_CARD_PARAM];
static
char
*
AutoSizing
[
SK_MAX_CARD_PARAM
];
static
char
*
Stats
[
SK_MAX_CARD_PARAM
];
module_param_array
(
Speed_A
,
charp
,
NULL
,
0
);
module_param_array
(
Speed_B
,
charp
,
NULL
,
0
);
module_param_array
(
AutoNeg_A
,
charp
,
NULL
,
0
);
module_param_array
(
AutoNeg_B
,
charp
,
NULL
,
0
);
module_param_array
(
DupCap_A
,
charp
,
NULL
,
0
);
module_param_array
(
DupCap_B
,
charp
,
NULL
,
0
);
module_param_array
(
FlowCtrl_A
,
charp
,
NULL
,
0
);
module_param_array
(
FlowCtrl_B
,
charp
,
NULL
,
0
);
module_param_array
(
Role_A
,
charp
,
NULL
,
0
);
module_param_array
(
Role_B
,
charp
,
NULL
,
0
);
module_param_array
(
ConType
,
charp
,
NULL
,
0
);
module_param_array
(
PrefPort
,
charp
,
NULL
,
0
);
module_param_array
(
RlmtMode
,
charp
,
NULL
,
0
);
/* used for interrupt moderation */
module_param_array
(
IntsPerSec
,
int
,
NULL
,
0
);
module_param_array
(
Moderation
,
charp
,
NULL
,
0
);
module_param_array
(
Stats
,
charp
,
NULL
,
0
);
module_param_array
(
ModerationMask
,
charp
,
NULL
,
0
);
module_param_array
(
AutoSizing
,
charp
,
NULL
,
0
);
/*****************************************************************************
*
* SkGeBoardInit - do level 0 and 1 initialization
...
...
@@ -503,6 +518,11 @@ SK_BOOL DualNet;
}
spin_lock_init
(
&
pAC
->
SlowPathLock
);
/* setup phy_id blink timer */
pAC
->
BlinkTimer
.
function
=
SkGeBlinkTimer
;
pAC
->
BlinkTimer
.
data
=
(
unsigned
long
)
dev
;
init_timer
(
&
pAC
->
BlinkTimer
);
/* level 0 init common modules here */
spin_lock_irqsave
(
&
pAC
->
SlowPathLock
,
Flags
);
...
...
@@ -601,12 +621,6 @@ SK_BOOL DualNet;
return
(
-
EAGAIN
);
}
/*
* Register the device here
*/
pAC
->
Next
=
SkGeRootDev
;
SkGeRootDev
=
dev
;
return
(
0
);
}
/* SkGeBoardInit */
...
...
@@ -887,7 +901,7 @@ DEV_NET *pNet;
SK_AC
*
pAC
;
SK_U32
IntSrc
;
/* interrupts source register contents */
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pAC
=
pNet
->
pAC
;
/*
...
...
@@ -1036,7 +1050,7 @@ DEV_NET *pNet;
SK_AC
*
pAC
;
SK_U32
IntSrc
;
/* interrupts source register contents */
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pAC
=
pNet
->
pAC
;
/*
...
...
@@ -1126,6 +1140,24 @@ SK_U32 IntSrc; /* interrupts source register contents */
return
SkIsrRetHandled
;
}
/* SkGeIsrOnePort */
#ifdef CONFIG_NET_POLL_CONTROLLER
/****************************************************************************
*
* SkGePollController - polling receive, for netconsole
*
* Description:
* Polling receive - used by netconsole and other diagnostic tools
* to allow network i/o with interrupts disabled.
*
* Returns: N/A
*/
static
void
SkGePollController
(
struct
net_device
*
dev
)
{
disable_irq
(
dev
->
irq
);
SkGeIsr
(
dev
->
irq
,
dev
,
NULL
);
enable_irq
(
dev
->
irq
);
}
#endif
/****************************************************************************
*
...
...
@@ -1152,7 +1184,7 @@ struct SK_NET_DEVICE *dev)
int
i
;
SK_EVPARA
EvPara
;
/* an event parameter union */
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pAC
=
pNet
->
pAC
;
SK_DBG_MSG
(
NULL
,
SK_DBGMOD_DRV
,
SK_DBGCAT_DRV_ENTRY
,
...
...
@@ -1166,10 +1198,6 @@ struct SK_NET_DEVICE *dev)
}
#endif
if
(
!
try_module_get
(
THIS_MODULE
))
{
return
(
-
1
);
/* increase of usage count not possible */
}
/* Set blink mode */
if
((
pAC
->
PciDev
->
vendor
==
0x1186
)
||
(
pAC
->
PciDev
->
vendor
==
0x11ab
))
pAC
->
GIni
.
GILedBlinkCtrl
=
OEM_CONFIG_VALUE
;
...
...
@@ -1177,7 +1205,6 @@ struct SK_NET_DEVICE *dev)
if
(
pAC
->
BoardLevel
==
SK_INIT_DATA
)
{
/* level 1 init common modules here */
if
(
SkGeInit
(
pAC
,
pAC
->
IoBase
,
SK_INIT_IO
)
!=
0
)
{
module_put
(
THIS_MODULE
);
/* decrease usage count */
printk
(
"%s: HWInit (1) failed.
\n
"
,
pAC
->
dev
[
pNet
->
PortNr
]
->
name
);
return
(
-
1
);
}
...
...
@@ -1193,7 +1220,6 @@ struct SK_NET_DEVICE *dev)
if
(
pAC
->
BoardLevel
!=
SK_INIT_RUN
)
{
/* tschilling: Level 2 init modules here, check return value. */
if
(
SkGeInit
(
pAC
,
pAC
->
IoBase
,
SK_INIT_RUN
)
!=
0
)
{
module_put
(
THIS_MODULE
);
/* decrease usage count */
printk
(
"%s: HWInit (2) failed.
\n
"
,
pAC
->
dev
[
pNet
->
PortNr
]
->
name
);
return
(
-
1
);
}
...
...
@@ -1279,19 +1305,18 @@ struct SK_NET_DEVICE *dev)
SK_DBG_MSG
(
NULL
,
SK_DBGMOD_DRV
,
SK_DBGCAT_DRV_ENTRY
,
(
"SkGeClose: pAC=0x%lX "
,
(
unsigned
long
)
pAC
));
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pAC
=
pNet
->
pAC
;
#ifdef SK_DIAG_SUPPORT
if
(
pAC
->
DiagModeActive
==
DIAG_ACTIVE
)
{
if
(
pAC
->
DiagFlowCtrl
==
SK_FALSE
)
{
module_put
(
THIS_MODULE
);
/*
** notify that the interface which has been closed
** by operator interaction must not be started up
** again when the DIAG has finished.
*/
newPtrNet
=
(
DEV_NET
*
)
pAC
->
dev
[
0
]
->
priv
;
newPtrNet
=
netdev_priv
(
pAC
->
dev
[
0
])
;
if
(
newPtrNet
==
pNet
)
{
pAC
->
WasIfUp
[
0
]
=
SK_FALSE
;
}
else
{
...
...
@@ -1376,7 +1401,6 @@ struct SK_NET_DEVICE *dev)
pAC
->
MaxPorts
--
;
pNet
->
Up
=
0
;
module_put
(
THIS_MODULE
);
return
(
0
);
}
/* SkGeClose */
...
...
@@ -1402,7 +1426,7 @@ DEV_NET *pNet;
SK_AC
*
pAC
;
int
Rc
;
/* return code of XmitFrame */
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pAC
=
pNet
->
pAC
;
if
((
!
skb_shinfo
(
skb
)
->
nr_frags
)
||
...
...
@@ -2498,7 +2522,7 @@ unsigned long Flags;
static
int
SkGeSetMacAddr
(
struct
SK_NET_DEVICE
*
dev
,
void
*
p
)
{
DEV_NET
*
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
DEV_NET
*
pNet
=
netdev_priv
(
dev
)
;
SK_AC
*
pAC
=
pNet
->
pAC
;
struct
sockaddr
*
addr
=
p
;
...
...
@@ -2555,7 +2579,7 @@ unsigned long Flags;
SK_DBG_MSG
(
NULL
,
SK_DBGMOD_DRV
,
SK_DBGCAT_DRV_ENTRY
,
(
"SkGeSetRxMode starts now... "
));
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pAC
=
pNet
->
pAC
;
if
(
pAC
->
RlmtNets
==
1
)
PortIdx
=
pAC
->
ActivePort
;
...
...
@@ -2627,7 +2651,7 @@ SK_EVPARA EvPara;
SK_DBG_MSG
(
NULL
,
SK_DBGMOD_DRV
,
SK_DBGCAT_DRV_ENTRY
,
(
"SkGeChangeMtu starts now...
\n
"
));
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pAC
=
pNet
->
pAC
;
if
((
NewMtu
<
68
)
||
(
NewMtu
>
SK_JUMBO_MTU
))
{
...
...
@@ -2649,7 +2673,7 @@ SK_EVPARA EvPara;
#endif
pNet
->
Mtu
=
NewMtu
;
pOtherNet
=
(
DEV_NET
*
)
pAC
->
dev
[
1
-
pNet
->
NetNr
]
->
priv
;
pOtherNet
=
netdev_priv
(
pAC
->
dev
[
1
-
pNet
->
NetNr
])
;
if
((
pOtherNet
->
Mtu
>
1500
)
&&
(
NewMtu
<=
1500
)
&&
(
pOtherNet
->
Up
==
1
))
{
return
(
0
);
}
...
...
@@ -2855,7 +2879,7 @@ SK_EVPARA EvPara;
*/
static
struct
net_device_stats
*
SkGeStats
(
struct
SK_NET_DEVICE
*
dev
)
{
DEV_NET
*
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
DEV_NET
*
pNet
=
netdev_priv
(
dev
)
;
SK_AC
*
pAC
=
pNet
->
pAC
;
SK_PNMI_STRUCT_DATA
*
pPnmiStruct
;
/* structure for all Pnmi-Data */
SK_PNMI_STAT
*
pPnmiStat
;
/* pointer to virtual XMAC stat. data */
...
...
@@ -2953,7 +2977,7 @@ int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32);
SK_DBG_MSG
(
NULL
,
SK_DBGMOD_DRV
,
SK_DBGCAT_DRV_ENTRY
,
(
"SkGeIoctl starts now...
\n
"
));
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pAC
=
pNet
->
pAC
;
if
(
copy_from_user
(
&
Ioctl
,
rq
->
ifr_data
,
sizeof
(
SK_GE_IOCTL
)))
{
...
...
@@ -4539,11 +4563,8 @@ char ClassStr[80];
int
SkDrvEnterDiagMode
(
SK_AC
*
pAc
)
/* pointer to adapter context */
{
SK_AC
*
pAC
=
NULL
;
DEV_NET
*
pNet
=
NULL
;
pNet
=
(
DEV_NET
*
)
pAc
->
dev
[
0
]
->
priv
;
pAC
=
pNet
->
pAC
;
DEV_NET
*
pNet
=
netdev_priv
(
pAc
->
dev
[
0
]);
SK_AC
*
pAC
=
pNet
->
pAC
;
SK_MEMCPY
(
&
(
pAc
->
PnmiBackup
),
&
(
pAc
->
PnmiStruct
),
sizeof
(
SK_PNMI_STRUCT_DATA
));
...
...
@@ -4558,8 +4579,8 @@ SK_AC *pAc) /* pointer to adapter context */
}
else
{
pAC
->
WasIfUp
[
0
]
=
SK_FALSE
;
}
if
(
pNet
!=
(
DEV_NET
*
)
pAc
->
dev
[
1
]
->
priv
)
{
pNet
=
(
DEV_NET
*
)
pAc
->
dev
[
1
]
->
priv
;
if
(
pNet
!=
netdev_priv
(
pAC
->
dev
[
1
])
)
{
pNet
=
netdev_priv
(
pAC
->
dev
[
1
])
;
if
(
pNet
->
Up
)
{
pAC
->
WasIfUp
[
1
]
=
SK_TRUE
;
pAC
->
DiagFlowCtrl
=
SK_TRUE
;
/* for SkGeClose */
...
...
@@ -4681,20 +4702,11 @@ int devNbr) /* what device is to be handled */
dev
=
pAC
->
dev
[
devNbr
];
/*
** Function SkGeClose() uses MOD_DEC_USE_COUNT (2.2/2.4)
** or module_put() (2.6) to decrease the number of users for
** a device, but if a device is to be put under control of
** the DIAG, that count is OK already and does not need to
** be adapted! Hence the opposite MOD_INC_USE_COUNT or
** try_module_get() needs to be used again to correct that.
/* On Linux 2.6 the network driver does NOT mess with reference
** counts. The driver MUST be able to be unloaded at any time
** due to the possibility of hotplug.
*/
if
(
!
try_module_get
(
THIS_MODULE
))
{
return
(
-
1
);
}
if
(
SkGeClose
(
dev
)
!=
0
)
{
module_put
(
THIS_MODULE
);
return
(
-
1
);
}
return
(
0
);
...
...
@@ -4723,17 +4735,6 @@ int devNbr) /* what device is to be handled */
if
(
SkGeOpen
(
dev
)
!=
0
)
{
return
(
-
1
);
}
else
{
/*
** Function SkGeOpen() uses MOD_INC_USE_COUNT (2.2/2.4)
** or try_module_get() (2.6) to increase the number of
** users for a device, but if a device was just under
** control of the DIAG, that count is OK already and
** does not need to be adapted! Hence the opposite
** MOD_DEC_USE_COUNT or module_put() needs to be used
** again to correct that.
*/
module_put
(
THIS_MODULE
);
}
/*
...
...
@@ -4904,9 +4905,6 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
SK_AC
*
pAC
;
DEV_NET
*
pNet
=
NULL
;
struct
net_device
*
dev
=
NULL
;
#ifdef CONFIG_PROC_FS
struct
proc_dir_entry
*
pProcFile
;
#endif
static
int
boards_found
=
0
;
int
error
=
-
ENODEV
;
...
...
@@ -4925,7 +4923,7 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
goto
out_disable_device
;
}
pNet
=
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pNet
->
pAC
=
kmalloc
(
sizeof
(
SK_AC
),
GFP_KERNEL
);
if
(
!
pNet
->
pAC
)
{
printk
(
KERN_ERR
"Unable to allocate adapter "
...
...
@@ -4960,8 +4958,12 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
dev
->
set_mac_address
=
&
SkGeSetMacAddr
;
dev
->
do_ioctl
=
&
SkGeIoctl
;
dev
->
change_mtu
=
&
SkGeChangeMtu
;
#ifdef CONFIG_NET_POLL_CONTROLLER
dev
->
poll_controller
=
&
SkGePollController
;
#endif
dev
->
flags
&=
~
IFF_RUNNING
;
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
);
SET_ETHTOOL_OPS
(
dev
,
&
SkGeEthtoolOps
);
#ifdef SK_ZEROCOPY
#ifdef USE_SK_TX_CHECKSUM
...
...
@@ -5002,14 +5004,7 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
memcpy
(
&
dev
->
dev_addr
,
&
pAC
->
Addr
.
Net
[
0
].
CurrentMacAddress
,
6
);
#ifdef CONFIG_PROC_FS
pProcFile
=
create_proc_entry
(
dev
->
name
,
S_IRUGO
,
pSkRootDir
);
if
(
pProcFile
)
{
pProcFile
->
proc_fops
=
&
sk_proc_fops
;
pProcFile
->
data
=
dev
;
pProcFile
->
owner
=
THIS_MODULE
;
}
#endif
SkGeProcCreate
(
dev
);
pNet
->
PortNr
=
0
;
pNet
->
NetNr
=
0
;
...
...
@@ -5025,7 +5020,7 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
}
pAC
->
dev
[
1
]
=
dev
;
pNet
=
dev
->
priv
;
pNet
=
netdev_priv
(
dev
)
;
pNet
->
PortNr
=
1
;
pNet
->
NetNr
=
1
;
pNet
->
pAC
=
pAC
;
...
...
@@ -5041,6 +5036,8 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
dev
->
do_ioctl
=
&
SkGeIoctl
;
dev
->
change_mtu
=
&
SkGeChangeMtu
;
dev
->
flags
&=
~
IFF_RUNNING
;
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
);
SET_ETHTOOL_OPS
(
dev
,
&
SkGeEthtoolOps
);
#ifdef SK_ZEROCOPY
#ifdef USE_SK_TX_CHECKSUM
...
...
@@ -5056,16 +5053,7 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
free_netdev
(
dev
);
pAC
->
dev
[
1
]
=
pAC
->
dev
[
0
];
}
else
{
#ifdef CONFIG_PROC_FS
pProcFile
=
create_proc_entry
(
dev
->
name
,
S_IRUGO
,
pSkRootDir
);
if
(
pProcFile
)
{
pProcFile
->
proc_fops
=
&
sk_proc_fops
;
pProcFile
->
data
=
dev
;
pProcFile
->
owner
=
THIS_MODULE
;
}
#endif
SkGeProcCreate
(
dev
);
memcpy
(
&
dev
->
dev_addr
,
&
pAC
->
Addr
.
Net
[
1
].
CurrentMacAddress
,
6
);
...
...
@@ -5101,19 +5089,14 @@ static int __devinit skge_probe_one(struct pci_dev *pdev,
static
void
__devexit
skge_remove_one
(
struct
pci_dev
*
pdev
)
{
struct
net_device
*
dev
=
pci_get_drvdata
(
pdev
);
DEV_NET
*
pNet
=
(
DEV_NET
*
)
dev
->
priv
;
DEV_NET
*
pNet
=
netdev_priv
(
dev
)
;
SK_AC
*
pAC
=
pNet
->
pAC
;
int
have_second_mac
=
0
;
if
((
pAC
->
GIni
.
GIMacsFound
==
2
)
&&
pAC
->
RlmtNets
==
2
)
have_second_mac
=
1
;
struct
net_device
*
otherdev
=
pAC
->
dev
[
1
];
remove_proc_entry
(
dev
->
name
,
pSkRootDir
);
SkGeProcRemove
(
dev
);
unregister_netdev
(
dev
);
if
(
have_second_mac
)
{
remove_proc_entry
(
pAC
->
dev
[
1
]
->
name
,
pSkRootDir
);
unregister_netdev
(
pAC
->
dev
[
1
]);
}
if
(
otherdev
!=
dev
)
SkGeProcRemove
(
otherdev
);
SkGeYellowLED
(
pAC
,
pAC
->
IoBase
,
0
);
...
...
@@ -5146,8 +5129,8 @@ static void __devexit skge_remove_one(struct pci_dev *pdev)
FreeResources
(
dev
);
free_netdev
(
dev
);
if
(
have_second_mac
)
free_netdev
(
pAC
->
dev
[
1
]
);
if
(
otherdev
!=
dev
)
free_netdev
(
otherdev
);
kfree
(
pAC
);
}
...
...
@@ -5180,34 +5163,21 @@ static int __init skge_init(void)
{
int
error
;
#ifdef CONFIG_PROC_FS
memcpy
(
&
SK_Root_Dir_entry
,
BOOT_STRING
,
sizeof
(
SK_Root_Dir_entry
)
-
1
);
pSkRootDir
=
proc_mkdir
(
SK_Root_Dir_entry
,
proc_net
);
if
(
!
pSkRootDir
)
{
printk
(
KERN_WARNING
"Unable to create /proc/net/%s"
,
SK_Root_Dir_entry
);
return
-
ENOMEM
;
}
pSkRootDir
->
owner
=
THIS_MODULE
;
#endif
error
=
pci_module_init
(
&
skge_driver
);
if
(
error
)
{
#ifdef CONFIG_PROC_FS
remove_proc_entry
(
pSkRootDir
->
name
,
proc_net
);
#endif
}
pSkRootDir
=
proc_mkdir
(
SKRootName
,
proc_net
);
if
(
pSkRootDir
)
pSkRootDir
->
owner
=
THIS_MODULE
;
error
=
pci_register_driver
(
&
skge_driver
);
if
(
error
)
proc_net_remove
(
SKRootName
);
return
error
;
}
static
void
__exit
skge_exit
(
void
)
{
pci_unregister_driver
(
&
skge_driver
);
#ifdef CONFIG_PROC_FS
remove_proc_entry
(
pSkRootDir
->
name
,
proc_net
);
#endif
pci_unregister_driver
(
&
skge_driver
);
proc_net_remove
(
SKRootName
);
}
module_init
(
skge_init
);
...
...
drivers/net/sk98lin/skproc.c
View file @
05c5f695
...
...
@@ -31,13 +31,9 @@
#include "h/skdrv2nd.h"
#include "h/skversion.h"
extern
struct
SK_NET_DEVICE
*
SkGeRootDev
;
static
int
sk_proc_print
(
void
*
writePtr
,
char
*
format
,
...);
static
void
sk_gen_browse
(
void
*
buffer
);
int
len
;
static
int
sk_seq_show
(
struct
seq_file
*
seq
,
void
*
v
);
static
int
sk_proc_open
(
struct
inode
*
inode
,
struct
file
*
file
);
struct
file_operations
sk_proc_fops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
sk_proc_open
,
...
...
@@ -45,315 +41,206 @@ struct file_operations sk_proc_fops = {
.
llseek
=
seq_lseek
,
.
release
=
single_release
,
};
struct
net_device
*
currDev
=
NULL
;
/*****************************************************************************
*
*
sk_gen_browse -generic print "summaries" entry
*
sk_seq_show - show proc information of a particular adapter
*
* Description:
* This function fills the proc entry with statistic data about
* the ethernet device.
* the ethernet device. It invokes the generic sk_gen_browse() to
* print out all items one per one.
*
* Returns:
-
*
* Returns:
0
*
*/
static
void
sk_gen_browse
(
void
*
buffer
)
static
int
sk_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
SK_NET_DEVICE
*
SkgeProcDev
=
SkGeRootDev
;
struct
SK_NET_DEVICE
*
next
;
SK_
PNMI_STRUCT_DATA
*
pPnmiStruct
;
SK_PNMI_ST
AT
*
pPnmiSta
t
;
struct
net_device
*
dev
=
seq
->
private
;
DEV_NET
*
pNet
=
netdev_priv
(
dev
)
;
SK_
AC
*
pAC
=
pNet
->
pAC
;
SK_PNMI_ST
RUCT_DATA
*
pPnmiStruct
=
&
pAC
->
PnmiStruc
t
;
unsigned
long
Flags
;
unsigned
int
Size
;
DEV_NET
*
pNet
;
SK_AC
*
pAC
;
char
sens_msg
[
50
];
int
MaxSecurityCount
=
0
;
int
t
;
int
i
;
while
(
SkgeProcDev
)
{
MaxSecurityCount
++
;
if
(
MaxSecurityCount
>
100
)
{
printk
(
"Max limit for sk_proc_read security counter!
\n
"
);
return
;
}
pNet
=
(
DEV_NET
*
)
SkgeProcDev
->
priv
;
pAC
=
pNet
->
pAC
;
next
=
pAC
->
Next
;
pPnmiStruct
=
&
pAC
->
PnmiStruct
;
/* NetIndex in GetStruct is now required, zero is only dummy */
for
(
t
=
pAC
->
GIni
.
GIMacsFound
;
t
>
0
;
t
--
)
{
if
((
pAC
->
GIni
.
GIMacsFound
==
2
)
&&
pAC
->
RlmtNets
==
1
)
t
--
;
/* NetIndex in GetStruct is now required, zero is only dummy */
for
(
t
=
pAC
->
GIni
.
GIMacsFound
;
t
>
0
;
t
--
)
{
if
((
pAC
->
GIni
.
GIMacsFound
==
2
)
&&
pAC
->
RlmtNets
==
1
)
t
--
;
spin_lock_irqsave
(
&
pAC
->
SlowPathLock
,
Flags
);
Size
=
SK_PNMI_STRUCT_SIZE
;
spin_lock_irqsave
(
&
pAC
->
SlowPathLock
,
Flags
);
Size
=
SK_PNMI_STRUCT_SIZE
;
#ifdef SK_DIAG_SUPPORT
if
(
pAC
->
BoardLevel
==
SK_INIT_DATA
)
{
SK_MEMCPY
(
&
(
pAC
->
PnmiStruct
),
&
(
pAC
->
PnmiBackup
),
sizeof
(
SK_PNMI_STRUCT_DATA
));
if
(
pAC
->
DiagModeActive
==
DIAG_NOTACTIVE
)
{
pAC
->
Pnmi
.
DiagAttached
=
SK_DIAG_IDLE
;
}
}
else
{
SkPnmiGetStruct
(
pAC
,
pAC
->
IoBase
,
pPnmiStruct
,
&
Size
,
t
-
1
);
if
(
pAC
->
BoardLevel
==
SK_INIT_DATA
)
{
SK_MEMCPY
(
&
(
pAC
->
PnmiStruct
),
&
(
pAC
->
PnmiBackup
),
sizeof
(
SK_PNMI_STRUCT_DATA
));
if
(
pAC
->
DiagModeActive
==
DIAG_NOTACTIVE
)
{
pAC
->
Pnmi
.
DiagAttached
=
SK_DIAG_IDLE
;
}
}
else
{
SkPnmiGetStruct
(
pAC
,
pAC
->
IoBase
,
pPnmiStruct
,
&
Size
,
t
-
1
);
}
#else
SkPnmiGetStruct
(
pAC
,
pAC
->
IoBase
,
SkPnmiGetStruct
(
pAC
,
pAC
->
IoBase
,
pPnmiStruct
,
&
Size
,
t
-
1
);
#endif
spin_unlock_irqrestore
(
&
pAC
->
SlowPathLock
,
Flags
);
spin_unlock_irqrestore
(
&
pAC
->
SlowPathLock
,
Flags
);
if
(
strcmp
(
pAC
->
dev
[
t
-
1
]
->
name
,
currDev
->
name
)
==
0
)
{
pPnmiStat
=
&
pPnmiStruct
->
Stat
[
0
];
len
=
sk_proc_print
(
buffer
,
"
\n
Detailed statistic for device %s
\n
"
,
pAC
->
dev
[
t
-
1
]
->
name
);
len
+=
sk_proc_print
(
buffer
,
"=======================================
\n
"
);
if
(
pAC
->
dev
[
t
-
1
]
==
dev
)
{
SK_PNMI_STAT
*
pPnmiStat
=
&
pPnmiStruct
->
Stat
[
0
];
seq_printf
(
seq
,
"
\n
Detailed statistic for device %s
\n
"
,
pAC
->
dev
[
t
-
1
]
->
name
);
seq_printf
(
seq
,
"=======================================
\n
"
);
/* Board statistics */
len
+=
sk_proc_print
(
buffer
,
"
\n
Board statistics
\n\n
"
);
len
+=
sk_proc_print
(
buffer
,
"Active Port %c
\n
"
,
'A'
+
pAC
->
Rlmt
.
Net
[
t
-
1
].
Port
[
pAC
->
Rlmt
.
Net
[
t
-
1
].
PrefPort
]
->
PortNumber
);
len
+=
sk_proc_print
(
buffer
,
"Preferred Port %c
\n
"
,
'A'
+
pAC
->
Rlmt
.
Net
[
t
-
1
].
Port
[
pAC
->
Rlmt
.
Net
[
t
-
1
].
PrefPort
]
->
PortNumber
);
/* Board statistics */
seq_printf
(
seq
,
"
\n
Board statistics
\n\n
"
);
seq_printf
(
seq
,
"Active Port %c
\n
"
,
'A'
+
pAC
->
Rlmt
.
Net
[
t
-
1
].
Port
[
pAC
->
Rlmt
.
Net
[
t
-
1
].
PrefPort
]
->
PortNumber
);
seq_printf
(
seq
,
"Preferred Port %c
\n
"
,
'A'
+
pAC
->
Rlmt
.
Net
[
t
-
1
].
Port
[
pAC
->
Rlmt
.
Net
[
t
-
1
].
PrefPort
]
->
PortNumber
);
len
+=
sk_proc_print
(
buffer
,
"Bus speed (MHz) %d
\n
"
,
pPnmiStruct
->
BusSpeed
);
seq_printf
(
seq
,
"Bus speed (MHz) %d
\n
"
,
pPnmiStruct
->
BusSpeed
);
len
+=
sk_proc_print
(
buffer
,
"Bus width (Bit) %d
\n
"
,
pPnmiStruct
->
BusWidth
);
len
+=
sk_proc_print
(
buffer
,
"Driver version %s
\n
"
,
VER_STRING
);
len
+=
sk_proc_print
(
buffer
,
"Hardware revision v%d.%d
\n
"
,
(
pAC
->
GIni
.
GIPciHwRev
>>
4
)
&
0x0F
,
pAC
->
GIni
.
GIPciHwRev
&
0x0F
);
seq_printf
(
seq
,
"Bus width (Bit) %d
\n
"
,
pPnmiStruct
->
BusWidth
);
seq_printf
(
seq
,
"Driver version %s
\n
"
,
VER_STRING
);
seq_printf
(
seq
,
"Hardware revision v%d.%d
\n
"
,
(
pAC
->
GIni
.
GIPciHwRev
>>
4
)
&
0x0F
,
pAC
->
GIni
.
GIPciHwRev
&
0x0F
);
/* Print sensor informations */
for
(
i
=
0
;
i
<
pAC
->
I2c
.
MaxSens
;
i
++
)
{
/* Check type */
switch
(
pAC
->
I2c
.
SenTable
[
i
].
SenType
)
{
case
1
:
strcpy
(
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenDesc
);
strcat
(
sens_msg
,
" (C)"
);
len
+=
sk_proc_print
(
buffer
,
"%-25s %d.%02d
\n
"
,
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
/
10
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
%
10
);
/* Print sensor informations */
for
(
i
=
0
;
i
<
pAC
->
I2c
.
MaxSens
;
i
++
)
{
/* Check type */
switch
(
pAC
->
I2c
.
SenTable
[
i
].
SenType
)
{
case
1
:
strcpy
(
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenDesc
);
strcat
(
sens_msg
,
" (C)"
);
seq_printf
(
seq
,
"%-25s %d.%02d
\n
"
,
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
/
10
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
%
10
);
strcpy
(
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenDesc
);
strcat
(
sens_msg
,
" (F)"
);
len
+=
sk_proc_print
(
buffer
,
"%-25s %d.%02d
\n
"
,
sens_msg
,
((((
pAC
->
I2c
.
SenTable
[
i
].
SenValue
)
*
10
)
*
9
)
/
5
+
3200
)
/
100
,
((((
pAC
->
I2c
.
SenTable
[
i
].
SenValue
)
*
10
)
*
9
)
/
5
+
3200
)
%
10
);
break
;
case
2
:
strcpy
(
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenDesc
);
strcat
(
sens_msg
,
" (V)"
);
len
+=
sk_proc_print
(
buffer
,
"%-25s %d.%03d
\n
"
,
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
/
1000
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
%
1000
);
break
;
case
3
:
strcpy
(
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenDesc
);
strcat
(
sens_msg
,
" (rpm)"
);
len
+=
sk_proc_print
(
buffer
,
"%-25s %d
\n
"
,
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
);
break
;
default:
break
;
}
strcpy
(
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenDesc
);
strcat
(
sens_msg
,
" (F)"
);
seq_printf
(
seq
,
"%-25s %d.%02d
\n
"
,
sens_msg
,
((((
pAC
->
I2c
.
SenTable
[
i
].
SenValue
)
*
10
)
*
9
)
/
5
+
3200
)
/
100
,
((((
pAC
->
I2c
.
SenTable
[
i
].
SenValue
)
*
10
)
*
9
)
/
5
+
3200
)
%
10
);
break
;
case
2
:
strcpy
(
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenDesc
);
strcat
(
sens_msg
,
" (V)"
);
seq_printf
(
seq
,
"%-25s %d.%03d
\n
"
,
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
/
1000
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
%
1000
);
break
;
case
3
:
strcpy
(
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenDesc
);
strcat
(
sens_msg
,
" (rpm)"
);
seq_printf
(
seq
,
"%-25s %d
\n
"
,
sens_msg
,
pAC
->
I2c
.
SenTable
[
i
].
SenValue
);
break
;
default:
break
;
}
}
/*Receive statistics */
len
+=
sk_proc_print
(
buffer
,
"
\n
Receive statistics
\n\n
"
);
/*Receive statistics */
seq_printf
(
seq
,
"
\n
Receive statistics
\n\n
"
);
len
+=
sk_proc_print
(
buffer
,
"Received bytes %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxOctetsOkCts
);
len
+=
sk_proc_print
(
buffer
,
"Received packets %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxOkCts
);
seq_printf
(
seq
,
"Received bytes %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxOctetsOkCts
);
seq_printf
(
seq
,
"Received packets %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxOkCts
);
#if 0
if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC &&
pAC->HWRevision < 12) {
pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
pPnmiStat->StatRxShortsCts;
pPnmiStat->StatRxShortsCts = 0;
}
if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC &&
pAC->HWRevision < 12) {
pPnmiStruct->InErrorsCts = pPnmiStruct->InErrorsCts -
pPnmiStat->StatRxShortsCts;
pPnmiStat->StatRxShortsCts = 0;
}
#endif
if
(
pNet
->
Mtu
>
1500
)
pPnmiStruct
->
InErrorsCts
=
pPnmiStruct
->
InErrorsCts
-
pPnmiStat
->
StatRxTooLongCts
;
if
(
dev
->
mtu
>
1500
)
pPnmiStruct
->
InErrorsCts
=
pPnmiStruct
->
InErrorsCts
-
pPnmiStat
->
StatRxTooLongCts
;
len
+=
sk_proc_print
(
buffer
,
"Receive errors %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStruct
->
InErrorsCts
);
len
+=
sk_proc_print
(
buffer
,
"Receive dropped %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStruct
->
RxNoBufCts
);
len
+=
sk_proc_print
(
buffer
,
"Received multicast %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxMulticastOkCts
);
len
+=
sk_proc_print
(
buffer
,
"Receive error types
\n
"
);
len
+=
sk_proc_print
(
buffer
,
" length %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxRuntCts
);
len
+=
sk_proc_print
(
buffer
,
" buffer overflow %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxFifoOverflowCts
);
len
+=
sk_proc_print
(
buffer
,
" bad crc %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxFcsCts
);
len
+=
sk_proc_print
(
buffer
,
" framing %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxFramingCts
);
len
+=
sk_proc_print
(
buffer
,
" missed frames %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxMissedCts
);
seq_printf
(
seq
,
"Receive errors %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStruct
->
InErrorsCts
);
seq_printf
(
seq
,
"Receive dropped %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStruct
->
RxNoBufCts
);
seq_printf
(
seq
,
"Received multicast %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxMulticastOkCts
);
seq_printf
(
seq
,
"Receive error types
\n
"
);
seq_printf
(
seq
,
" length %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxRuntCts
);
seq_printf
(
seq
,
" buffer overflow %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxFifoOverflowCts
);
seq_printf
(
seq
,
" bad crc %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxFcsCts
);
seq_printf
(
seq
,
" framing %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxFramingCts
);
seq_printf
(
seq
,
" missed frames %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxMissedCts
);
if
(
pNet
->
M
tu
>
1500
)
pPnmiStat
->
StatRxTooLongCts
=
0
;
if
(
dev
->
m
tu
>
1500
)
pPnmiStat
->
StatRxTooLongCts
=
0
;
len
+=
sk_proc_print
(
buffer
,
" too long %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxTooLongCts
);
len
+=
sk_proc_print
(
buffer
,
" carrier extension %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxCextCts
);
len
+=
sk_proc_print
(
buffer
,
" too short %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxShortsCts
);
len
+=
sk_proc_print
(
buffer
,
" symbol %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxSymbolCts
);
len
+=
sk_proc_print
(
buffer
,
" LLC MAC size %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxIRLengthCts
);
len
+=
sk_proc_print
(
buffer
,
" carrier event %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxCarrierCts
);
len
+=
sk_proc_print
(
buffer
,
" jabber %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxJabberCts
);
seq_printf
(
seq
,
" too long %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxTooLongCts
);
seq_printf
(
seq
,
" carrier extension %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxCextCts
);
seq_printf
(
seq
,
" too short %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxShortsCts
);
seq_printf
(
seq
,
" symbol %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxSymbolCts
);
seq_printf
(
seq
,
" LLC MAC size %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxIRLengthCts
);
seq_printf
(
seq
,
" carrier event %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxCarrierCts
);
seq_printf
(
seq
,
" jabber %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatRxJabberCts
);
/*Transmit statistics */
len
+=
sk_proc_print
(
buffer
,
"
\n
Transmit statistics
\n\n
"
);
/*Transmit statistics */
seq_printf
(
seq
,
"
\n
Transmit statistics
\n\n
"
);
len
+=
sk_proc_print
(
buffer
,
"Transmited bytes %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxOctetsOkCts
);
len
+=
sk_proc_print
(
buffer
,
"Transmited packets %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxOkCts
);
len
+=
sk_proc_print
(
buffer
,
"Transmit errors %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxSingleCollisionCts
);
len
+=
sk_proc_print
(
buffer
,
"Transmit dropped %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStruct
->
TxNoBufCts
);
len
+=
sk_proc_print
(
buffer
,
"Transmit collisions %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxSingleCollisionCts
);
len
+=
sk_proc_print
(
buffer
,
"Transmit error types
\n
"
);
len
+=
sk_proc_print
(
buffer
,
" excessive collision %ld
\n
"
,
pAC
->
stats
.
tx_aborted_errors
);
len
+=
sk_proc_print
(
buffer
,
" carrier %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxCarrierCts
);
len
+=
sk_proc_print
(
buffer
,
" fifo underrun %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxFifoUnderrunCts
);
len
+=
sk_proc_print
(
buffer
,
" heartbeat %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxCarrierCts
);
len
+=
sk_proc_print
(
buffer
,
" window %ld
\n
"
,
pAC
->
stats
.
tx_window_errors
);
seq_printf
(
seq
,
"Transmited bytes %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxOctetsOkCts
);
seq_printf
(
seq
,
"Transmited packets %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxOkCts
);
seq_printf
(
seq
,
"Transmit errors %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxSingleCollisionCts
);
seq_printf
(
seq
,
"Transmit dropped %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStruct
->
TxNoBufCts
);
seq_printf
(
seq
,
"Transmit collisions %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxSingleCollisionCts
);
seq_printf
(
seq
,
"Transmit error types
\n
"
);
seq_printf
(
seq
,
" excessive collision %ld
\n
"
,
pAC
->
stats
.
tx_aborted_errors
);
seq_printf
(
seq
,
" carrier %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxCarrierCts
);
seq_printf
(
seq
,
" fifo underrun %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxFifoUnderrunCts
);
seq_printf
(
seq
,
" heartbeat %Lu
\n
"
,
(
unsigned
long
long
)
pPnmiStat
->
StatTxCarrierCts
);
seq_printf
(
seq
,
" window %ld
\n
"
,
pAC
->
stats
.
tx_window_errors
);
}
/* if (strcmp(pACname, currDeviceName) == 0) */
}
SkgeProcDev
=
next
;
}
}
/*****************************************************************************
*
* sk_proc_print -generic line print
*
* Description:
* This function fills the proc entry with statistic data about
* the ethernet device.
*
* Returns: number of bytes written
*
*/
static
int
sk_proc_print
(
void
*
writePtr
,
char
*
format
,
...)
{
#define MAX_LEN_SINGLE_LINE 256
char
str
[
MAX_LEN_SINGLE_LINE
];
va_list
a_start
;
int
lenght
=
0
;
struct
seq_file
*
seq
=
(
struct
seq_file
*
)
writePtr
;
SK_MEMSET
(
str
,
0
,
MAX_LEN_SINGLE_LINE
);
va_start
(
a_start
,
format
);
vsprintf
(
str
,
format
,
a_start
);
va_end
(
a_start
);
lenght
=
strlen
(
str
);
seq_printf
(
seq
,
str
);
return
lenght
;
}
/*****************************************************************************
*
* sk_seq_show - show proc information of a particular adapter
*
* Description:
* This function fills the proc entry with statistic data about
* the ethernet device. It invokes the generic sk_gen_browse() to
* print out all items one per one.
*
* Returns: number of bytes written
*
*/
static
int
sk_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
void
*
castedBuffer
=
(
void
*
)
seq
;
currDev
=
seq
->
private
;
sk_gen_browse
(
castedBuffer
);
return
0
;
return
0
;
}
/*****************************************************************************
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment