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
e867bd28
Commit
e867bd28
authored
Jul 27, 2004
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge pobox.com:/spare/repo/netdev-2.6/skge
into pobox.com:/spare/repo/netdev-2.6/ALL
parents
e97a6614
4e896d73
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
322 additions
and
478 deletions
+322
-478
drivers/net/sk98lin/h/skdrv2nd.h
drivers/net/sk98lin/h/skdrv2nd.h
+0
-54
drivers/net/sk98lin/skaddr.c
drivers/net/sk98lin/skaddr.c
+2
-2
drivers/net/sk98lin/skge.c
drivers/net/sk98lin/skge.c
+320
-422
No files found.
drivers/net/sk98lin/h/skdrv2nd.h
View file @
e867bd28
...
...
@@ -53,60 +53,6 @@
#include "h/skrlmt.h"
#include "h/skgedrv.h"
#define SK_PCI_ISCOMPLIANT(result, pdev) { \
result = SK_FALSE;
/* default */
\
/* 3Com (0x10b7) */
\
if (pdev->vendor == 0x10b7) { \
/* Gigabit Ethernet Adapter (0x1700) */
\
if ((pdev->device == 0x1700) || \
(pdev->device == 0x80eb)) { \
result = SK_TRUE; \
} \
/* SysKonnect (0x1148) */
\
} else if (pdev->vendor == 0x1148) { \
/* SK-98xx Gigabit Ethernet Server Adapter (0x4300) */
\
/* SK-98xx V2.0 Gigabit Ethernet Adapter (0x4320) */
\
if ((pdev->device == 0x4300) || \
(pdev->device == 0x4320)) { \
result = SK_TRUE; \
} \
/* D-Link (0x1186) */
\
} else if (pdev->vendor == 0x1186) { \
/* Gigabit Ethernet Adapter (0x4c00) */
\
if ((pdev->device == 0x4c00)) { \
result = SK_TRUE; \
} \
/* Marvell (0x11ab) */
\
} else if (pdev->vendor == 0x11ab) { \
/* Gigabit Ethernet Adapter (0x4320) */
\
/* Gigabit Ethernet Adapter (0x4360) */
\
/* Gigabit Ethernet Adapter (0x4361) */
\
/* Belkin (0x5005) */
\
if ((pdev->device == 0x4320) || \
(pdev->device == 0x4360) || \
(pdev->device == 0x4361) || \
(pdev->device == 0x5005)) { \
result = SK_TRUE; \
} \
/* CNet (0x1371) */
\
} else if (pdev->vendor == 0x1371) { \
/* GigaCard Network Adapter (0x434e) */
\
if ((pdev->device == 0x434e)) { \
result = SK_TRUE; \
} \
/* Linksys (0x1737) */
\
} else if (pdev->vendor == 0x1737) { \
/* Gigabit Network Adapter (0x1032) */
\
/* Gigabit Network Adapter (0x1064) */
\
if ((pdev->device == 0x1032) || \
(pdev->device == 0x1064)) { \
result = SK_TRUE; \
} \
} else { \
result = SK_FALSE; \
} \
}
extern
SK_MBUF
*
SkDrvAllocRlmtMbuf
(
SK_AC
*
,
SK_IOC
,
unsigned
);
extern
void
SkDrvFreeRlmtMbuf
(
SK_AC
*
,
SK_IOC
,
SK_MBUF
*
);
...
...
drivers/net/sk98lin/skaddr.c
View file @
e867bd28
...
...
@@ -892,7 +892,7 @@ SK_AC *pAC, /* adapter context */
SK_IOC
IoC
,
/* I/O context */
SK_U32
PortNumber
)
/* Port Number */
{
int
ReturnCode
;
int
ReturnCode
=
0
;
#if (!defined(SK_SLIM) || defined(DEBUG))
if
(
PortNumber
>=
(
SK_U32
)
pAC
->
GIni
.
GIMacsFound
)
{
return
(
SK_ADDR_ILLEGAL_PORT
);
...
...
@@ -1424,7 +1424,7 @@ SK_IOC IoC, /* I/O context */
SK_U32
PortNumber
,
/* port whose promiscuous mode changes */
int
NewPromMode
)
/* new promiscuous mode */
{
int
ReturnCode
;
int
ReturnCode
=
0
;
#if (!defined(SK_SLIM) || defined(DEBUG))
if
(
PortNumber
>=
(
SK_U32
)
pAC
->
GIni
.
GIMacsFound
)
{
return
(
SK_ADDR_ILLEGAL_PORT
);
...
...
drivers/net/sk98lin/skge.c
View file @
e867bd28
...
...
@@ -239,7 +239,7 @@ static int SkDrvDeInitAdapter(SK_AC *pAC, int devNbr);
#ifdef CONFIG_PROC_FS
static
const
char
SK_Root_Dir_entry
[]
=
"sk98lin"
;
static
struct
proc_dir_entry
*
pSkRootDir
=
NULL
;
static
struct
proc_dir_entry
*
pSkRootDir
;
extern
struct
file_operations
sk_proc_fops
;
#endif
...
...
@@ -255,303 +255,13 @@ static void DumpLong(char*, int);
#endif
/* global variables *********************************************************/
static
const
char
*
BootString
=
BOOT_STRING
;
struct
SK_NET_DEVICE
*
SkGeRootDev
=
NULL
;
static
int
probed
__initdata
=
0
;
static
SK_BOOL
DoPrintInterfaceChange
=
SK_TRUE
;
/* local variables **********************************************************/
static
uintptr_t
TxQueueAddr
[
SK_MAX_MACS
][
2
]
=
{{
0x680
,
0x600
},{
0x780
,
0x700
}};
static
uintptr_t
RxQueueAddr
[
SK_MAX_MACS
]
=
{
0x400
,
0x480
};
#ifdef CONFIG_PROC_FS
static
struct
proc_dir_entry
*
pSkRootDir
;
#endif
/*****************************************************************************
*
* skge_probe - find all SK-98xx adapters
*
* Description:
* This function scans the PCI bus for SK-98xx adapters. Resources for
* each adapter are allocated and the adapter is brought into Init 1
* state.
*
* Returns:
* 0, if everything is ok
* !=0, on error
*/
static
int
__init
skge_probe
(
void
)
{
int
boards_found
=
0
;
int
vendor_flag
=
SK_FALSE
;
SK_AC
*
pAC
;
DEV_NET
*
pNet
=
NULL
;
struct
pci_dev
*
pdev
=
NULL
;
struct
SK_NET_DEVICE
*
dev
=
NULL
;
SK_BOOL
DeviceFound
=
SK_FALSE
;
SK_BOOL
BootStringCount
=
SK_FALSE
;
int
retval
;
#ifdef CONFIG_PROC_FS
struct
proc_dir_entry
*
pProcFile
;
#endif
if
(
probed
)
return
-
ENODEV
;
probed
++
;
while
((
pdev
=
pci_find_class
(
PCI_CLASS_NETWORK_ETHERNET
<<
8
,
pdev
)))
{
if
(
pci_enable_device
(
pdev
))
{
continue
;
}
dev
=
NULL
;
pNet
=
NULL
;
/* Don't handle Yukon2 cards at the moment */
/* 12-feb-2004 ---- mlindner@syskonnect.de */
if
(
pdev
->
vendor
==
0x11ab
)
{
if
(
(
pdev
->
device
==
0x4360
)
||
(
pdev
->
device
==
0x4361
)
)
continue
;
}
SK_PCI_ISCOMPLIANT
(
vendor_flag
,
pdev
);
if
(
!
vendor_flag
)
continue
;
/* Configure DMA attributes. */
if
(
pci_set_dma_mask
(
pdev
,
(
u64
)
0xffffffffffffffffULL
)
&&
pci_set_dma_mask
(
pdev
,
(
u64
)
0xffffffff
))
continue
;
if
((
dev
=
alloc_etherdev
(
sizeof
(
DEV_NET
)))
==
NULL
)
{
printk
(
KERN_ERR
"Unable to allocate etherdev "
"structure!
\n
"
);
break
;
}
pNet
=
dev
->
priv
;
pNet
->
pAC
=
kmalloc
(
sizeof
(
SK_AC
),
GFP_KERNEL
);
if
(
pNet
->
pAC
==
NULL
){
free_netdev
(
dev
);
printk
(
KERN_ERR
"Unable to allocate adapter "
"structure!
\n
"
);
break
;
}
/* Print message */
if
(
!
BootStringCount
)
{
/* set display flag to TRUE so that */
/* we only display this string ONCE */
BootStringCount
=
SK_TRUE
;
printk
(
"%s
\n
"
,
BootString
);
}
memset
(
pNet
->
pAC
,
0
,
sizeof
(
SK_AC
));
pAC
=
pNet
->
pAC
;
pAC
->
PciDev
=
pdev
;
pAC
->
PciDevId
=
pdev
->
device
;
pAC
->
dev
[
0
]
=
dev
;
pAC
->
dev
[
1
]
=
dev
;
sprintf
(
pAC
->
Name
,
"SysKonnect SK-98xx"
);
pAC
->
CheckQueue
=
SK_FALSE
;
pNet
->
Mtu
=
1500
;
pNet
->
Up
=
0
;
dev
->
irq
=
pdev
->
irq
;
retval
=
SkGeInitPCI
(
pAC
);
if
(
retval
)
{
printk
(
"SKGE: PCI setup failed: %i
\n
"
,
retval
);
free_netdev
(
dev
);
continue
;
}
SET_MODULE_OWNER
(
dev
);
dev
->
open
=
&
SkGeOpen
;
dev
->
stop
=
&
SkGeClose
;
dev
->
hard_start_xmit
=
&
SkGeXmit
;
dev
->
get_stats
=
&
SkGeStats
;
dev
->
last_stats
=
&
SkGeStats
;
dev
->
set_multicast_list
=
&
SkGeSetRxMode
;
dev
->
set_mac_address
=
&
SkGeSetMacAddr
;
dev
->
do_ioctl
=
&
SkGeIoctl
;
dev
->
change_mtu
=
&
SkGeChangeMtu
;
dev
->
flags
&=
~
IFF_RUNNING
;
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
);
#ifdef SK_ZEROCOPY
#ifdef USE_SK_TX_CHECKSUM
if
(
pAC
->
ChipsetType
)
{
/* Use only if yukon hardware */
/* SK and ZEROCOPY - fly baby... */
dev
->
features
|=
NETIF_F_SG
|
NETIF_F_IP_CSUM
;
}
#endif
#endif
pAC
->
Index
=
boards_found
;
if
(
SkGeBoardInit
(
dev
,
pAC
))
{
free_netdev
(
dev
);
continue
;
}
/* Register net device */
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"SKGE: Could not register device.
\n
"
);
FreeResources
(
dev
);
free_netdev
(
dev
);
continue
;
}
/* Print adapter specific string from vpd */
ProductStr
(
pAC
);
printk
(
"%s: %s
\n
"
,
dev
->
name
,
pAC
->
DeviceStr
);
/* Print configuration settings */
printk
(
" PrefPort:%c RlmtMode:%s
\n
"
,
'A'
+
pAC
->
Rlmt
.
Net
[
0
].
Port
[
pAC
->
Rlmt
.
Net
[
0
].
PrefPort
]
->
PortNumber
,
(
pAC
->
RlmtMode
==
0
)
?
"Check Link State"
:
((
pAC
->
RlmtMode
==
1
)
?
"Check Link State"
:
((
pAC
->
RlmtMode
==
3
)
?
"Check Local Port"
:
((
pAC
->
RlmtMode
==
7
)
?
"Check Segmentation"
:
((
pAC
->
RlmtMode
==
17
)
?
"Dual Check Link State"
:
"Error"
)))));
SkGeYellowLED
(
pAC
,
pAC
->
IoBase
,
1
);
memcpy
((
caddr_t
)
&
dev
->
dev_addr
,
(
caddr_t
)
&
pAC
->
Addr
.
Net
[
0
].
CurrentMacAddress
,
6
);
/* First adapter... Create proc and print message */
#ifdef CONFIG_PROC_FS
if
(
!
DeviceFound
)
{
DeviceFound
=
SK_TRUE
;
SK_MEMCPY
(
&
SK_Root_Dir_entry
,
BootString
,
sizeof
(
SK_Root_Dir_entry
)
-
1
);
/*Create proc (directory)*/
if
(
!
pSkRootDir
)
{
pSkRootDir
=
proc_mkdir
(
SK_Root_Dir_entry
,
proc_net
);
if
(
!
pSkRootDir
)
{
printk
(
KERN_WARNING
"%s: Unable to create /proc/net/%s"
,
dev
->
name
,
SK_Root_Dir_entry
);
}
else
{
pSkRootDir
->
owner
=
THIS_MODULE
;
}
}
}
/* Create proc file */
if
(
pSkRootDir
&&
(
pProcFile
=
create_proc_entry
(
dev
->
name
,
S_IRUGO
,
pSkRootDir
)))
{
pProcFile
->
proc_fops
=
&
sk_proc_fops
;
pProcFile
->
data
=
dev
;
}
#endif
pNet
->
PortNr
=
0
;
pNet
->
NetNr
=
0
;
boards_found
++
;
/* More then one port found */
if
((
pAC
->
GIni
.
GIMacsFound
==
2
)
&&
(
pAC
->
RlmtNets
==
2
))
{
if
((
dev
=
alloc_etherdev
(
sizeof
(
DEV_NET
)))
==
0
)
{
printk
(
KERN_ERR
"Unable to allocate etherdev "
"structure!
\n
"
);
break
;
}
pAC
->
dev
[
1
]
=
dev
;
pNet
=
dev
->
priv
;
pNet
->
PortNr
=
1
;
pNet
->
NetNr
=
1
;
pNet
->
pAC
=
pAC
;
pNet
->
Mtu
=
1500
;
pNet
->
Up
=
0
;
dev
->
open
=
&
SkGeOpen
;
dev
->
stop
=
&
SkGeClose
;
dev
->
hard_start_xmit
=
&
SkGeXmit
;
dev
->
get_stats
=
&
SkGeStats
;
dev
->
last_stats
=
&
SkGeStats
;
dev
->
set_multicast_list
=
&
SkGeSetRxMode
;
dev
->
set_mac_address
=
&
SkGeSetMacAddr
;
dev
->
do_ioctl
=
&
SkGeIoctl
;
dev
->
change_mtu
=
&
SkGeChangeMtu
;
dev
->
flags
&=
~
IFF_RUNNING
;
#ifdef SK_ZEROCOPY
#ifdef USE_SK_TX_CHECKSUM
if
(
pAC
->
ChipsetType
)
{
/* SG and ZEROCOPY - fly baby... */
dev
->
features
|=
NETIF_F_SG
|
NETIF_F_IP_CSUM
;
}
#endif
#endif
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"SKGE: Could not register device.
\n
"
);
free_netdev
(
dev
);
pAC
->
dev
[
1
]
=
pAC
->
dev
[
0
];
}
else
{
#ifdef CONFIG_PROC_FS
if
(
pSkRootDir
&&
(
pProcFile
=
create_proc_entry
(
dev
->
name
,
S_IRUGO
,
pSkRootDir
)))
{
pProcFile
->
proc_fops
=
&
sk_proc_fops
;
pProcFile
->
data
=
dev
;
}
#endif
memcpy
((
caddr_t
)
&
dev
->
dev_addr
,
(
caddr_t
)
&
pAC
->
Addr
.
Net
[
1
].
CurrentMacAddress
,
6
);
printk
(
"%s: %s
\n
"
,
dev
->
name
,
pAC
->
DeviceStr
);
printk
(
" PrefPort:B RlmtMode:Dual Check Link State
\n
"
);
}
}
/* Save the hardware revision */
pAC
->
HWRevision
=
(((
pAC
->
GIni
.
GIPciHwRev
>>
4
)
&
0x0F
)
*
10
)
+
(
pAC
->
GIni
.
GIPciHwRev
&
0x0F
);
/* Set driver globals */
pAC
->
Pnmi
.
pDriverFileName
=
DRIVER_FILE_NAME
;
pAC
->
Pnmi
.
pDriverReleaseDate
=
DRIVER_REL_DATE
;
SK_MEMSET
(
&
(
pAC
->
PnmiBackup
),
0
,
sizeof
(
SK_PNMI_STRUCT_DATA
));
SK_MEMCPY
(
&
(
pAC
->
PnmiBackup
),
&
(
pAC
->
PnmiStruct
),
sizeof
(
SK_PNMI_STRUCT_DATA
));
/*
* This is bollocks, but we need to tell the net-init
* code that it shall go for the next device.
*/
#ifndef MODULE
dev
->
base_addr
=
0
;
#endif
}
/*
* If we're at this point we're going through skge_probe() for
* the first time. Return success (0) if we've initialized 1
* or more boards. Otherwise, return failure (-ENODEV).
*/
return
boards_found
;
}
/* skge_probe */
/*****************************************************************************
*
* SkGeInitPCI - Init the PCI resources
...
...
@@ -666,9 +376,6 @@ 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"
);
/* not used, just there because every driver should have them: */
MODULE_PARM
(
options
,
"1-"
__MODULE_STRING
(
SK_MAX_CARD_PARAM
)
"i"
);
MODULE_PARM
(
debug
,
"i"
);
/* 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"
);
...
...
@@ -755,123 +462,12 @@ static char *RlmtMode[SK_MAX_CARD_PARAM] = RLMT_MODE;
static
char
*
RlmtMode
[
SK_MAX_CARD_PARAM
]
=
{
""
,
};
#endif
static
int
debug
=
0
;
/* not used */
static
int
options
[
SK_MAX_CARD_PARAM
]
=
{
0
,
};
/* not used */
static
int
IntsPerSec
[
SK_MAX_CARD_PARAM
];
static
char
*
Moderation
[
SK_MAX_CARD_PARAM
];
static
char
*
ModerationMask
[
SK_MAX_CARD_PARAM
];
static
char
*
AutoSizing
[
SK_MAX_CARD_PARAM
];
static
char
*
Stats
[
SK_MAX_CARD_PARAM
];
/*****************************************************************************
*
* skge_init_module - module initialization function
*
* Description:
* Very simple, only call skge_probe and return approriate result.
*
* Returns:
* 0, if everything is ok
* !=0, on error
*/
static
int
__init
skge_init_module
(
void
)
{
int
cards
;
SkGeRootDev
=
NULL
;
/* just to avoid warnings ... */
debug
=
0
;
options
[
0
]
=
0
;
cards
=
skge_probe
();
if
(
cards
==
0
)
{
printk
(
"sk98lin: No adapter found.
\n
"
);
}
return
cards
?
0
:
-
ENODEV
;
}
/* skge_init_module */
/*****************************************************************************
*
* skge_cleanup_module - module unload function
*
* Description:
* Disable adapter if it is still running, free resources,
* free device struct.
*
* Returns: N/A
*/
static
void
__exit
skge_cleanup_module
(
void
)
{
DEV_NET
*
pNet
;
SK_AC
*
pAC
;
struct
SK_NET_DEVICE
*
next
;
unsigned
long
Flags
;
SK_EVPARA
EvPara
;
while
(
SkGeRootDev
)
{
pNet
=
(
DEV_NET
*
)
SkGeRootDev
->
priv
;
pAC
=
pNet
->
pAC
;
next
=
pAC
->
Next
;
netif_stop_queue
(
SkGeRootDev
);
SkGeYellowLED
(
pAC
,
pAC
->
IoBase
,
0
);
if
(
pAC
->
BoardLevel
==
SK_INIT_RUN
)
{
/* board is still alive */
spin_lock_irqsave
(
&
pAC
->
SlowPathLock
,
Flags
);
EvPara
.
Para32
[
0
]
=
0
;
EvPara
.
Para32
[
1
]
=
-
1
;
SkEventQueue
(
pAC
,
SKGE_RLMT
,
SK_RLMT_STOP
,
EvPara
);
EvPara
.
Para32
[
0
]
=
1
;
EvPara
.
Para32
[
1
]
=
-
1
;
SkEventQueue
(
pAC
,
SKGE_RLMT
,
SK_RLMT_STOP
,
EvPara
);
SkEventDispatcher
(
pAC
,
pAC
->
IoBase
);
/* disable interrupts */
SK_OUT32
(
pAC
->
IoBase
,
B0_IMSK
,
0
);
SkGeDeInit
(
pAC
,
pAC
->
IoBase
);
spin_unlock_irqrestore
(
&
pAC
->
SlowPathLock
,
Flags
);
pAC
->
BoardLevel
=
SK_INIT_DATA
;
/* We do NOT check here, if IRQ was pending, of course*/
}
if
(
pAC
->
BoardLevel
==
SK_INIT_IO
)
{
/* board is still alive */
SkGeDeInit
(
pAC
,
pAC
->
IoBase
);
pAC
->
BoardLevel
=
SK_INIT_DATA
;
}
if
((
pAC
->
GIni
.
GIMacsFound
==
2
)
&&
pAC
->
RlmtNets
==
2
){
unregister_netdev
(
pAC
->
dev
[
1
]);
free_netdev
(
pAC
->
dev
[
1
]);
}
FreeResources
(
SkGeRootDev
);
SkGeRootDev
->
get_stats
=
NULL
;
/*
* otherwise unregister_netdev calls get_stats with
* invalid IO ... :-(
*/
unregister_netdev
(
SkGeRootDev
);
free_netdev
(
SkGeRootDev
);
kfree
(
pAC
);
SkGeRootDev
=
next
;
}
#ifdef CONFIG_PROC_FS
/* clear proc-dir */
remove_proc_entry
(
pSkRootDir
->
name
,
proc_net
);
#endif
}
/* skge_cleanup_module */
module_init
(
skge_init_module
);
module_exit
(
skge_cleanup_module
);
/*****************************************************************************
*
* SkGeBoardInit - do level 0 and 1 initialization
...
...
@@ -3094,8 +2690,7 @@ SK_EVPARA EvPara;
SkEventDispatcher
(
pAC
,
pAC
->
IoBase
);
for
(
i
=
0
;
i
<
pAC
->
GIni
.
GIMacsFound
;
i
++
)
{
spin_lock_irqsave
(
&
pAC
->
TxPort
[
i
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
spin_lock
(
&
pAC
->
TxPort
[
i
][
TX_PRIO_LOW
].
TxDesRingLock
);
netif_stop_queue
(
pAC
->
dev
[
i
]);
}
...
...
@@ -4774,12 +4369,10 @@ SK_BOOL DualNet;
spin_lock_irqsave
(
&
pAC
->
TxPort
[
FromPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
spin_lock_irqsave
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
spin_lock
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
);
SkGeStopPort
(
pAC
,
IoC
,
FromPort
,
SK_STOP_ALL
,
SK_SOFT_RST
);
SkGeStopPort
(
pAC
,
IoC
,
ToPort
,
SK_STOP_ALL
,
SK_SOFT_RST
);
spin_unlock_irqrestore
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
spin_unlock
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
);
spin_unlock_irqrestore
(
&
pAC
->
TxPort
[
FromPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
...
...
@@ -4792,8 +4385,7 @@ SK_BOOL DualNet;
spin_lock_irqsave
(
&
pAC
->
TxPort
[
FromPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
spin_lock_irqsave
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
spin_lock
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
);
pAC
->
ActivePort
=
ToPort
;
#if 0
SetQueueSizes(pAC);
...
...
@@ -4808,8 +4400,7 @@ SK_BOOL DualNet;
pAC
,
pAC
->
ActivePort
,
DualNet
))
{
spin_unlock_irqrestore
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
spin_unlock
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
);
spin_unlock_irqrestore
(
&
pAC
->
TxPort
[
FromPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
...
...
@@ -4835,8 +4426,7 @@ SK_BOOL DualNet;
SkGePollTxD
(
pAC
,
IoC
,
ToPort
,
SK_TRUE
);
ClearAndStartRx
(
pAC
,
FromPort
);
ClearAndStartRx
(
pAC
,
ToPort
);
spin_unlock_irqrestore
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
spin_unlock
(
&
pAC
->
TxPort
[
ToPort
][
TX_PRIO_LOW
].
TxDesRingLock
);
spin_unlock_irqrestore
(
&
pAC
->
TxPort
[
FromPort
][
TX_PRIO_LOW
].
TxDesRingLock
,
Flags
);
...
...
@@ -5311,8 +4901,316 @@ int l;
#endif
/*******************************************************************************
*
* End of file
*
******************************************************************************/
static
int
__devinit
skge_probe_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
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
;
if
(
pci_enable_device
(
pdev
))
goto
out
;
/* Configure DMA attributes. */
if
(
pci_set_dma_mask
(
pdev
,
(
u64
)
0xffffffffffffffffULL
)
&&
pci_set_dma_mask
(
pdev
,
(
u64
)
0xffffffff
))
goto
out_disable_device
;
if
((
dev
=
alloc_etherdev
(
sizeof
(
DEV_NET
)))
==
NULL
)
{
printk
(
KERN_ERR
"Unable to allocate etherdev "
"structure!
\n
"
);
goto
out_disable_device
;
}
pNet
=
dev
->
priv
;
pNet
->
pAC
=
kmalloc
(
sizeof
(
SK_AC
),
GFP_KERNEL
);
if
(
!
pNet
->
pAC
)
{
printk
(
KERN_ERR
"Unable to allocate adapter "
"structure!
\n
"
);
goto
out_free_netdev
;
}
memset
(
pNet
->
pAC
,
0
,
sizeof
(
SK_AC
));
pAC
=
pNet
->
pAC
;
pAC
->
PciDev
=
pdev
;
pAC
->
PciDevId
=
pdev
->
device
;
pAC
->
dev
[
0
]
=
dev
;
pAC
->
dev
[
1
]
=
dev
;
sprintf
(
pAC
->
Name
,
"SysKonnect SK-98xx"
);
pAC
->
CheckQueue
=
SK_FALSE
;
pNet
->
Mtu
=
1500
;
pNet
->
Up
=
0
;
dev
->
irq
=
pdev
->
irq
;
error
=
SkGeInitPCI
(
pAC
);
if
(
error
)
{
printk
(
"SKGE: PCI setup failed: %i
\n
"
,
error
);
goto
out_free_netdev
;
}
SET_MODULE_OWNER
(
dev
);
dev
->
open
=
&
SkGeOpen
;
dev
->
stop
=
&
SkGeClose
;
dev
->
hard_start_xmit
=
&
SkGeXmit
;
dev
->
get_stats
=
&
SkGeStats
;
dev
->
last_stats
=
&
SkGeStats
;
dev
->
set_multicast_list
=
&
SkGeSetRxMode
;
dev
->
set_mac_address
=
&
SkGeSetMacAddr
;
dev
->
do_ioctl
=
&
SkGeIoctl
;
dev
->
change_mtu
=
&
SkGeChangeMtu
;
dev
->
flags
&=
~
IFF_RUNNING
;
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
);
#ifdef SK_ZEROCOPY
#ifdef USE_SK_TX_CHECKSUM
if
(
pAC
->
ChipsetType
)
{
/* Use only if yukon hardware */
/* SK and ZEROCOPY - fly baby... */
dev
->
features
|=
NETIF_F_SG
|
NETIF_F_IP_CSUM
;
}
#endif
#endif
pAC
->
Index
=
boards_found
++
;
if
(
SkGeBoardInit
(
dev
,
pAC
))
goto
out_free_netdev
;
/* Register net device */
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"SKGE: Could not register device.
\n
"
);
goto
out_free_resources
;
}
/* Print adapter specific string from vpd */
ProductStr
(
pAC
);
printk
(
"%s: %s
\n
"
,
dev
->
name
,
pAC
->
DeviceStr
);
/* Print configuration settings */
printk
(
" PrefPort:%c RlmtMode:%s
\n
"
,
'A'
+
pAC
->
Rlmt
.
Net
[
0
].
Port
[
pAC
->
Rlmt
.
Net
[
0
].
PrefPort
]
->
PortNumber
,
(
pAC
->
RlmtMode
==
0
)
?
"Check Link State"
:
((
pAC
->
RlmtMode
==
1
)
?
"Check Link State"
:
((
pAC
->
RlmtMode
==
3
)
?
"Check Local Port"
:
((
pAC
->
RlmtMode
==
7
)
?
"Check Segmentation"
:
((
pAC
->
RlmtMode
==
17
)
?
"Dual Check Link State"
:
"Error"
)))));
SkGeYellowLED
(
pAC
,
pAC
->
IoBase
,
1
);
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
pNet
->
PortNr
=
0
;
pNet
->
NetNr
=
0
;
boards_found
++
;
/* More then one port found */
if
((
pAC
->
GIni
.
GIMacsFound
==
2
)
&&
(
pAC
->
RlmtNets
==
2
))
{
if
((
dev
=
alloc_etherdev
(
sizeof
(
DEV_NET
)))
==
0
)
{
printk
(
KERN_ERR
"Unable to allocate etherdev "
"structure!
\n
"
);
goto
out
;
}
pAC
->
dev
[
1
]
=
dev
;
pNet
=
dev
->
priv
;
pNet
->
PortNr
=
1
;
pNet
->
NetNr
=
1
;
pNet
->
pAC
=
pAC
;
pNet
->
Mtu
=
1500
;
pNet
->
Up
=
0
;
dev
->
open
=
&
SkGeOpen
;
dev
->
stop
=
&
SkGeClose
;
dev
->
hard_start_xmit
=
&
SkGeXmit
;
dev
->
get_stats
=
&
SkGeStats
;
dev
->
last_stats
=
&
SkGeStats
;
dev
->
set_multicast_list
=
&
SkGeSetRxMode
;
dev
->
set_mac_address
=
&
SkGeSetMacAddr
;
dev
->
do_ioctl
=
&
SkGeIoctl
;
dev
->
change_mtu
=
&
SkGeChangeMtu
;
dev
->
flags
&=
~
IFF_RUNNING
;
#ifdef SK_ZEROCOPY
#ifdef USE_SK_TX_CHECKSUM
if
(
pAC
->
ChipsetType
)
{
/* SG and ZEROCOPY - fly baby... */
dev
->
features
|=
NETIF_F_SG
|
NETIF_F_IP_CSUM
;
}
#endif
#endif
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"SKGE: Could not register device.
\n
"
);
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
memcpy
(
&
dev
->
dev_addr
,
&
pAC
->
Addr
.
Net
[
1
].
CurrentMacAddress
,
6
);
printk
(
"%s: %s
\n
"
,
dev
->
name
,
pAC
->
DeviceStr
);
printk
(
" PrefPort:B RlmtMode:Dual Check Link State
\n
"
);
}
}
/* Save the hardware revision */
pAC
->
HWRevision
=
(((
pAC
->
GIni
.
GIPciHwRev
>>
4
)
&
0x0F
)
*
10
)
+
(
pAC
->
GIni
.
GIPciHwRev
&
0x0F
);
/* Set driver globals */
pAC
->
Pnmi
.
pDriverFileName
=
DRIVER_FILE_NAME
;
pAC
->
Pnmi
.
pDriverReleaseDate
=
DRIVER_REL_DATE
;
memset
(
&
pAC
->
PnmiBackup
,
0
,
sizeof
(
SK_PNMI_STRUCT_DATA
));
memcpy
(
&
pAC
->
PnmiBackup
,
&
pAC
->
PnmiStruct
,
sizeof
(
SK_PNMI_STRUCT_DATA
));
pci_set_drvdata
(
pdev
,
dev
);
return
0
;
out_free_resources:
FreeResources
(
dev
);
out_free_netdev:
free_netdev
(
dev
);
out_disable_device:
pci_disable_device
(
pdev
);
out:
return
error
;
}
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
;
SK_AC
*
pAC
=
pNet
->
pAC
;
int
have_second_mac
=
0
;
if
((
pAC
->
GIni
.
GIMacsFound
==
2
)
&&
pAC
->
RlmtNets
==
2
)
have_second_mac
=
1
;
unregister_netdev
(
dev
);
if
(
have_second_mac
)
unregister_netdev
(
pAC
->
dev
[
1
]);
SkGeYellowLED
(
pAC
,
pAC
->
IoBase
,
0
);
if
(
pAC
->
BoardLevel
==
SK_INIT_RUN
)
{
SK_EVPARA
EvPara
;
unsigned
long
Flags
;
/* board is still alive */
spin_lock_irqsave
(
&
pAC
->
SlowPathLock
,
Flags
);
EvPara
.
Para32
[
0
]
=
0
;
EvPara
.
Para32
[
1
]
=
-
1
;
SkEventQueue
(
pAC
,
SKGE_RLMT
,
SK_RLMT_STOP
,
EvPara
);
EvPara
.
Para32
[
0
]
=
1
;
EvPara
.
Para32
[
1
]
=
-
1
;
SkEventQueue
(
pAC
,
SKGE_RLMT
,
SK_RLMT_STOP
,
EvPara
);
SkEventDispatcher
(
pAC
,
pAC
->
IoBase
);
/* disable interrupts */
SK_OUT32
(
pAC
->
IoBase
,
B0_IMSK
,
0
);
SkGeDeInit
(
pAC
,
pAC
->
IoBase
);
spin_unlock_irqrestore
(
&
pAC
->
SlowPathLock
,
Flags
);
pAC
->
BoardLevel
=
SK_INIT_DATA
;
/* We do NOT check here, if IRQ was pending, of course*/
}
if
(
pAC
->
BoardLevel
==
SK_INIT_IO
)
{
/* board is still alive */
SkGeDeInit
(
pAC
,
pAC
->
IoBase
);
pAC
->
BoardLevel
=
SK_INIT_DATA
;
}
FreeResources
(
dev
);
free_netdev
(
dev
);
if
(
have_second_mac
)
free_netdev
(
pAC
->
dev
[
1
]);
kfree
(
pAC
);
}
static
struct
pci_device_id
skge_pci_tbl
[]
=
{
{
PCI_VENDOR_ID_3COM
,
0x1700
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_3COM
,
0x80eb
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_SYSKONNECT
,
0x4300
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_SYSKONNECT
,
0x4320
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_DLINK
,
0x4c00
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_MARVELL
,
0x4320
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
#if 0 /* don't handle Yukon2 cards at the moment -- mlindner@syskonnect.de */
{ PCI_VENDOR_ID_MARVELL, 0x4360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ PCI_VENDOR_ID_MARVELL, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
#endif
{
PCI_VENDOR_ID_MARVELL
,
0x5005
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_CNET
,
0x434e
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_LINKSYS
,
0x1032
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_VENDOR_ID_LINKSYS
,
0x1064
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
0
,
}
};
static
struct
pci_driver
skge_driver
=
{
.
name
=
"skge"
,
.
id_table
=
skge_pci_tbl
,
.
probe
=
skge_probe_one
,
.
remove
=
__devexit_p
(
skge_remove_one
),
};
static
int
__init
skge_init
(
void
)
{
int
error
;
memcpy
(
&
SK_Root_Dir_entry
,
BOOT_STRING
,
sizeof
(
SK_Root_Dir_entry
)
-
1
);
#ifdef CONFIG_PROC_FS
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
}
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
}
module_init
(
skge_init
);
module_exit
(
skge_exit
);
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