[PATCH] (23/23) sk98: eliminate large controller scratch pad elements
From: Stephen Hemminger <hidden>
Date: 2004-11-12 00:11:54
Get rid of 44K of space in the driver structure which was just being used as a scratch pad when making the calls to read stats. PnmiStruct can just be kmalloc'd/kfree in those cases. PNMI initialization can be done in one place using existing macro's for consistency Don't need to cast and mask when converting u64 to u32. Signed-off-by: Stephen Hemminger <redacted> diff -Nru a/drivers/net/sk98lin/h/skdrv2nd.h b/drivers/net/sk98lin/h/skdrv2nd.h
--- a/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-09 15:29:24 -08:00
+++ b/drivers/net/sk98lin/h/skdrv2nd.h 2004-11-09 15:29:24 -08:00@@ -385,9 +385,9 @@ 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 */ + + int RlmtMode; /* link check mode to set */ + int RlmtNets; /* Number of nets */ SK_IOC IoBase; /* register set of adapter */ int BoardLevel; /* level of active hw init (0-2) */
@@ -425,7 +425,6 @@ #ifdef SK_DIAG_SUPPORT SK_U32 DiagModeActive; /* is diag active? */ SK_BOOL DiagFlowCtrl; /* for control purposes */ - SK_PNMI_STRUCT_DATA PnmiBackup; /* backup structure for all Pnmi-Data */ SK_BOOL WasIfUp[SK_MAX_MACS]; /* for OpenClose while * DIAG is busy with NIC */
diff -Nru a/drivers/net/sk98lin/skethtool.c b/drivers/net/sk98lin/skethtool.c
--- a/drivers/net/sk98lin/skethtool.c 2004-11-09 15:29:24 -08:00
+++ b/drivers/net/sk98lin/skethtool.c 2004-11-09 15:29:24 -08:00@@ -297,9 +297,26 @@ 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; + DEV_NET *pNet = netdev_priv(dev); + SK_AC *pAC = pNet->pAC; + unsigned long flags; + unsigned int size; + int err; + SK_PNMI_STRUCT_DATA *pPnmiStruct; + + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + size = sizeof(*pPnmiStruct); + spin_lock_irqsave(&pAC->SlowPathLock, flags); + err = SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &size, pNet->NetNr); + spin_unlock_irqrestore(&pAC->SlowPathLock, flags); + + if (err) + return; *data++ = pPnmiStruct->Stat[0].StatRxOkCts; *data++ = pPnmiStruct->Stat[0].StatTxOkCts;
diff -Nru a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c
--- a/drivers/net/sk98lin/skge.c 2004-11-09 15:29:23 -08:00
+++ b/drivers/net/sk98lin/skge.c 2004-11-09 15:29:24 -08:00@@ -214,7 +214,7 @@ static void ClearTxRing(SK_AC*, TX_PORT*); static int SkGeChangeMtu(struct net_device *dev, int new_mtu); static void PortReInitBmu(SK_AC*, int); -static int SkGeIocMib(DEV_NET*, unsigned int, int); +static unsigned int SkGeIocMib(DEV_NET*, SK_PNMI_STRUCT_DATA *,unsigned int, int); static int SkGeInitPCI(SK_AC *pAC); static void StartDrvCleanupTimer(SK_AC *pAC); static void StopDrvCleanupTimer(SK_AC *pAC);
@@ -457,13 +457,6 @@ 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; - -#ifdef SK_DIAG_SUPPORT - pAC->PnmiBackup = pAC->PnmiStruct; -#endif pci_set_drvdata(pdev, dev); return 0;
@@ -780,8 +773,6 @@ static int SkGeBoardInit(struct net_device *dev, SK_AC *pAC) { short i; -char *DescrString = "sk98lin: Driver for Linux"; /* this is given to PNMI */ -char *VerStr = VER_STRING; int Ret; /* return code of request_irq */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY,
@@ -821,8 +812,10 @@ pAC->BoardLevel = SK_INIT_DATA; pAC->RxBufSize = ETH_BUF_SIZE; - SK_PNMI_SET_DRIVER_DESCR(pAC, DescrString); - SK_PNMI_SET_DRIVER_VER(pAC, VerStr); + SK_PNMI_SET_DRIVER_DESCR(pAC, "sk98lin: Driver for Linux"); + SK_PNMI_SET_DRIVER_VER(pAC, VER_STRING); + SK_PNMI_SET_DRIVER_FILENAME(pAC, DRIVER_FILE_NAME); + SK_PNMI_SET_DRIVER_RELDATE(pAC, DRIVER_REL_DATE); /* level 1 init common modules here (HW init) */ if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) {
@@ -1657,9 +1650,6 @@ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeClose: done ")); -#ifdef SK_DIAG_SUPPORT - pAC->PnmiBackup = pAC->PnmiStruct; -#endif pAC->MaxPorts--; return (0);
@@ -3034,69 +3024,60 @@ 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 */ -SK_PNMI_CONF *pPnmiConf; /* pointer to virtual link config. */ unsigned int Size; /* size of pnmi struct */ unsigned long Flags; /* for spin lock */ SK_DBG_MSG(NULL, SK_DBGMOD_DRV, SK_DBGCAT_DRV_ENTRY, ("SkGeStats starts now...\n")); - pPnmiStruct = &pAC->PnmiStruct; -#ifdef SK_DIAG_SUPPORT - if ((pAC->DiagModeActive == DIAG_NOTACTIVE) && - (pAC->BoardLevel == SK_INIT_RUN)) { -#endif - SK_MEMSET(pPnmiStruct, 0, sizeof(SK_PNMI_STRUCT_DATA)); + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_ATOMIC); + if (!pPnmiStruct) + goto out; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + Size = sizeof(*pPnmiStruct); + spin_lock_irqsave(&pAC->SlowPathLock, Flags); - Size = SK_PNMI_STRUCT_SIZE; SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); - spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); -#ifdef SK_DIAG_SUPPORT - } -#endif pPnmiStat = &pPnmiStruct->Stat[0]; - pPnmiConf = &pPnmiStruct->Conf[0]; - pAC->stats.rx_packets = (SK_U32) pPnmiStruct->RxDeliveredCts & 0xFFFFFFFF; - pAC->stats.tx_packets = (SK_U32) pPnmiStat->StatTxOkCts & 0xFFFFFFFF; - pAC->stats.rx_bytes = (SK_U32) pPnmiStruct->RxOctetsDeliveredCts; - pAC->stats.tx_bytes = (SK_U32) pPnmiStat->StatTxOctetsOkCts; + memset(&pAC->stats, 0, sizeof(struct net_device_stats)); + pAC->stats.rx_packets = pPnmiStruct->RxDeliveredCts; + pAC->stats.tx_packets = pPnmiStat->StatTxOkCts; + pAC->stats.rx_bytes = pPnmiStruct->RxOctetsDeliveredCts; + pAC->stats.tx_bytes = pPnmiStat->StatTxOctetsOkCts; - if (dev->mtu <= 1500) { - pAC->stats.rx_errors = (SK_U32) pPnmiStruct->InErrorsCts & 0xFFFFFFFF; - } else { - pAC->stats.rx_errors = (SK_U32) ((pPnmiStruct->InErrorsCts - - pPnmiStat->StatRxTooLongCts) & 0xFFFFFFFF); - } - + pAC->stats.rx_errors = pPnmiStruct->InErrorsCts; + if (dev->mtu > 1500) + pAC->stats.rx_errors -= pPnmiStat->StatRxTooLongCts; if (pAC->GIni.GP[0].PhyType == SK_PHY_XMAC && pAC->HWRevision < 12) - pAC->stats.rx_errors = pAC->stats.rx_errors - pPnmiStat->StatRxShortsCts; + pAC->stats.rx_errors -= pPnmiStat->StatRxShortsCts; - pAC->stats.tx_errors = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF; - pAC->stats.rx_dropped = (SK_U32) pPnmiStruct->RxNoBufCts & 0xFFFFFFFF; - pAC->stats.tx_dropped = (SK_U32) pPnmiStruct->TxNoBufCts & 0xFFFFFFFF; - pAC->stats.multicast = (SK_U32) pPnmiStat->StatRxMulticastOkCts & 0xFFFFFFFF; - pAC->stats.collisions = (SK_U32) pPnmiStat->StatTxSingleCollisionCts & 0xFFFFFFFF; + pAC->stats.tx_errors = pPnmiStat->StatTxSingleCollisionCts; + pAC->stats.rx_dropped = pPnmiStruct->RxNoBufCts; + pAC->stats.tx_dropped = pPnmiStruct->TxNoBufCts; + pAC->stats.multicast = pPnmiStat->StatRxMulticastOkCts; + pAC->stats.collisions = pPnmiStat->StatTxSingleCollisionCts; /* detailed rx_errors: */ - pAC->stats.rx_length_errors = (SK_U32) pPnmiStat->StatRxRuntCts & 0xFFFFFFFF; - pAC->stats.rx_over_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF; - pAC->stats.rx_crc_errors = (SK_U32) pPnmiStat->StatRxFcsCts & 0xFFFFFFFF; - pAC->stats.rx_frame_errors = (SK_U32) pPnmiStat->StatRxFramingCts & 0xFFFFFFFF; - pAC->stats.rx_fifo_errors = (SK_U32) pPnmiStat->StatRxFifoOverflowCts & 0xFFFFFFFF; - pAC->stats.rx_missed_errors = (SK_U32) pPnmiStat->StatRxMissedCts & 0xFFFFFFFF; + pAC->stats.rx_length_errors = pPnmiStat->StatRxRuntCts; + pAC->stats.rx_over_errors = pPnmiStat->StatRxFifoOverflowCts; + pAC->stats.rx_crc_errors = pPnmiStat->StatRxFcsCts; + pAC->stats.rx_frame_errors = pPnmiStat->StatRxFramingCts; + pAC->stats.rx_fifo_errors = pPnmiStat->StatRxFifoOverflowCts; + pAC->stats.rx_missed_errors = pPnmiStat->StatRxMissedCts; /* detailed tx_errors */ - pAC->stats.tx_aborted_errors = (SK_U32) 0; - pAC->stats.tx_carrier_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; - pAC->stats.tx_fifo_errors = (SK_U32) pPnmiStat->StatTxFifoUnderrunCts & 0xFFFFFFFF; - pAC->stats.tx_heartbeat_errors = (SK_U32) pPnmiStat->StatTxCarrierCts & 0xFFFFFFFF; - pAC->stats.tx_window_errors = (SK_U32) 0; + pAC->stats.tx_carrier_errors = pPnmiStat->StatTxCarrierCts; + pAC->stats.tx_fifo_errors = pPnmiStat->StatTxFifoUnderrunCts; + pAC->stats.tx_heartbeat_errors = pPnmiStat->StatTxCarrierCts; - return(&pAC->stats); + kfree(pPnmiStruct); + out: + return &pAC->stats; } /* SkGeStats */
@@ -3119,9 +3100,7 @@ SK_AC *pAC; void *pMemBuf; SK_GE_IOCTL Ioctl; -unsigned int Err = 0; -int Size = 0; -int Ret = 0; +int Err = 0; unsigned int Length = 0; int HeaderLength = sizeof(SK_U32) + sizeof(SK_U32);
@@ -3140,27 +3119,35 @@ case SK_IOCTL_PRESETMIB: if (!capable(CAP_NET_ADMIN)) return -EPERM; case SK_IOCTL_GETMIB: - if(copy_from_user(&pAC->PnmiStruct, Ioctl.pData, - Ioctl.Len<sizeof(pAC->PnmiStruct)? - Ioctl.Len : sizeof(pAC->PnmiStruct))) { - return -EFAULT; - } - Size = SkGeIocMib(pNet, Ioctl.Len, cmd); - if(copy_to_user(Ioctl.pData, &pAC->PnmiStruct, - Ioctl.Len<Size? Ioctl.Len : Size)) { - return -EFAULT; - } - Ioctl.Len = Size; - if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + { + SK_PNMI_STRUCT_DATA *pPnmiStruct; + + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return -ENOMEM; + + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); + + if (copy_from_user(pPnmiStruct, Ioctl.pData, + min(sizeof(*pPnmiStruct), Ioctl.Len))) return -EFAULT; + + Length = SkGeIocMib(pNet, pPnmiStruct, Ioctl.Len, cmd); + if (copy_to_user(Ioctl.pData, pPnmiStruct, + min(Length, Ioctl.Len))) + Err = -EFAULT; + else { + Ioctl.Len = Length; + if (copy_to_user(rq->ifr_data, &Ioctl, + sizeof(SK_GE_IOCTL))) + Err = -EFAULT; } + kfree(pPnmiStruct); break; + } case SK_IOCTL_GEN: - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; - } else { - Length = sizeof(pAC->PnmiStruct) + HeaderLength; - } + Length = min(Ioctl.Len, SK_PNMI_STRUCT_SIZE + HeaderLength); + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { return -ENOMEM; }
@@ -3168,16 +3155,16 @@ Err = -EFAULT; goto fault_gen; } - if ((Ret = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { + if ((Err = SkPnmiGenIoctl(pAC, pAC->IoBase, pMemBuf, &Length, 0)) < 0) { Err = -EFAULT; goto fault_gen; } - if(copy_to_user(Ioctl.pData, pMemBuf, Length) ) { + if (copy_to_user(Ioctl.pData, pMemBuf, Length) ) { Err = -EFAULT; goto fault_gen; } Ioctl.Len = Length; - if(copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { + if (copy_to_user(rq->ifr_data, &Ioctl, sizeof(SK_GE_IOCTL))) { Err = -EFAULT; goto fault_gen; }
@@ -3187,15 +3174,14 @@ #ifdef SK_DIAG_SUPPORT case SK_IOCTL_DIAG: if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (Ioctl.Len < (sizeof(pAC->PnmiStruct) + HeaderLength)) { - Length = Ioctl.Len; - } else { - Length = sizeof(pAC->PnmiStruct) + HeaderLength; - } + + Length = min(Ioctl.Len, SK_PNMI_STRUCT_SIZE + HeaderLength); + if (NULL == (pMemBuf = kmalloc(Length, GFP_KERNEL))) { return -ENOMEM; } - if(copy_from_user(pMemBuf, Ioctl.pData, Length)) { + + if (copy_from_user(pMemBuf, Ioctl.pData, Length)) { Err = -EFAULT; goto fault_diag; }
@@ -3230,7 +3216,6 @@ } /* SkGeIoctl */ - /***************************************************************************** * * SkGeIocMib - handle a GetMib, SetMib- or PresetMib-ioctl message
@@ -3248,8 +3233,9 @@ * Returns: * returned size from PNMI call */ -static int SkGeIocMib( +static unsigned int SkGeIocMib( DEV_NET *pNet, /* pointer to the adapter context */ +SK_PNMI_STRUCT_DATA *pPnmiStruct, /* structure for all Pnmi-Data */ unsigned int Size, /* length of ioctl data */ int mode) /* flag for set/preset */ {
@@ -3263,16 +3249,13 @@ spin_lock_irqsave(&pAC->SlowPathLock, Flags); switch(mode) { case SK_IOCTL_GETMIB: - SkPnmiGetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; case SK_IOCTL_PRESETMIB: - SkPnmiPreSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiPreSetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; case SK_IOCTL_SETMIB: - SkPnmiSetStruct(pAC, pAC->IoBase, &pAC->PnmiStruct, &Size, - pNet->NetNr); + SkPnmiSetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, pNet->NetNr); break; default: break;
@@ -4689,8 +4672,6 @@ DEV_NET *pNet = netdev_priv(pAc->dev[0]); SK_AC *pAC = pNet->pAC; - pAc->PnmiBackup = pAC->PnmiStruct; - pAC->DiagModeActive = DIAG_ACTIVE; if (pAC->BoardLevel > SK_INIT_DATA) { if (netif_running(pAC->dev[0])) {
@@ -4730,7 +4711,6 @@ int SkDrvLeaveDiagMode( SK_AC *pAc) /* pointer to adapter control context */ { - pAc->PnmiStruct = pAc->PnmiBackup; pAc->DiagModeActive = DIAG_NOTACTIVE; pAc->Pnmi.DiagAttached = SK_DIAG_IDLE; if (pAc->WasIfUp[0] == SK_TRUE) {
diff -Nru a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c
--- a/drivers/net/sk98lin/skproc.c 2004-11-09 15:29:23 -08:00
+++ b/drivers/net/sk98lin/skproc.c 2004-11-09 15:29:23 -08:00@@ -60,33 +60,26 @@ struct net_device *dev = seq->private; DEV_NET *pNet = netdev_priv(dev); SK_AC *pAC = pNet->pAC; - SK_PNMI_STRUCT_DATA *pPnmiStruct = &pAC->PnmiStruct; + SK_PNMI_STRUCT_DATA *pPnmiStruct; unsigned long Flags; unsigned int Size; char sens_msg[50]; int t; int i; + pPnmiStruct = kmalloc(sizeof(*pPnmiStruct), GFP_KERNEL); + if (!pPnmiStruct) + return -ENOMEM; + /* 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--; + memset(pPnmiStruct, 0, sizeof(*pPnmiStruct)); spin_lock_irqsave(&pAC->SlowPathLock, Flags); Size = SK_PNMI_STRUCT_SIZE; -#ifdef SK_DIAG_SUPPORT - if (pAC->BoardLevel == SK_INIT_DATA) { - pAC->PnmiStruct = pAC->PnmiBackup; - 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, - pPnmiStruct, &Size, t-1); -#endif + SkPnmiGetStruct(pAC, pAC->IoBase, pPnmiStruct, &Size, t-1); spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); if (pAC->dev[t-1] == dev) {
@@ -240,6 +233,7 @@ } } + kfree(pPnmiStruct); return 0; }