All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] wavelan_cs: stop inlining largish static functions
@ 2008-04-01  0:56 Denys Vlasenko
  0 siblings, 0 replies; only message in thread
From: Denys Vlasenko @ 2008-04-01  0:56 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-kernel, linux-wireless

[-- Attachment #1: Type: text/plain, Size: 855 bytes --]

Hi John,

Can you please take a look at this patch?

drivers/net/wireless/wavelan_cs.c has unusually large number
of static inline functions - 27.

I looked through them and 20 of them do not seem to warrant inlining.
Some are really big; others call mdelay(1) or busy-wait for a bit
to be set in a hardware register - it's pointless
to optimize such functions for speed.

This patch removes "inline" from these static function
(regardless of number of callsites - gcc nowadays auto-inlines
statics with one callsite).

Size difference for 32bit x86:

   text    data     bss     dec     hex filename
  17020     372       8   17400    43f8 linux-2.6-ALLYES/drivers/net/wireless/wavelan_cs.o
  14032     356       8   14396    383c linux-2.6.inline-ALLYES/drivers/net/wireless/wavelan_cs.o

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
--
vda

[-- Attachment #2: deinline_wavelan_cs.diff --]
[-- Type: text/x-diff, Size: 19600 bytes --]

diff -urp -U 10 linux-2.6/drivers/net/wireless/wavelan_cs.c linux-2.6.inline/drivers/net/wireless/wavelan_cs.c
--- linux-2.6/drivers/net/wireless/wavelan_cs.c	2008-03-30 03:27:46.000000000 +0200
+++ linux-2.6.inline/drivers/net/wireless/wavelan_cs.c	2008-04-01 02:34:14.000000000 +0200
@@ -95,21 +95,21 @@ hacr_write(u_long	base,
 	   u_char	hacr)
 {
   outb(hacr, HACR(base));
 } /* hacr_write */
 
 /*------------------------------------------------------------------*/
 /*
  * Write to card's Host Adapter Command Register. Include a delay for
  * those times when it is needed.
  */
-static inline void
+static void
 hacr_write_slow(u_long	base,
 		u_char	hacr)
 {
   hacr_write(base, hacr);
   /* delay might only be needed sometimes */
   mdelay(1);
 } /* hacr_write_slow */
 
 /*------------------------------------------------------------------*/
 /*
@@ -248,59 +248,59 @@ update_psa_checksum(struct net_device *	
   if(crc != 0)
     printk(KERN_WARNING "%s: update_psa_checksum(): CRC does not agree with PSA data (even after recalculating)\n", dev->name);
 #endif /* DEBUG_IOCTL_INFO */
 #endif	/* SET_PSA_CRC */
 } /* update_psa_checksum */
 
 /*------------------------------------------------------------------*/
 /*
  * Write 1 byte to the MMC.
  */
-static inline void
+static void
 mmc_out(u_long		base,
 	u_short		o,
 	u_char		d)
 {
   int count = 0;
 
   /* Wait for MMC to go idle */
   while((count++ < 100) && (inb(HASR(base)) & HASR_MMI_BUSY))
     udelay(10);
 
   outb((u_char)((o << 1) | MMR_MMI_WR), MMR(base));
   outb(d, MMD(base));
 }
 
 /*------------------------------------------------------------------*/
 /*
  * Routine to write bytes to the Modem Management Controller.
  * We start by the end because it is the way it should be !
  */
-static inline void
+static void
 mmc_write(u_long	base,
 	  u_char	o,
 	  u_char *	b,
 	  int		n)
 {
   o += n;
   b += n;
 
   while(n-- > 0 )
     mmc_out(base, --o, *(--b));
 } /* mmc_write */
 
 /*------------------------------------------------------------------*/
 /*
  * Read 1 byte from the MMC.
  * Optimised version for 1 byte, avoid using memory...
  */
-static inline u_char
+static u_char
 mmc_in(u_long	base,
        u_short	o)
 {
   int count = 0;
 
   while((count++ < 100) && (inb(HASR(base)) & HASR_MMI_BUSY))
     udelay(10);
   outb(o << 1, MMR(base));		/* Set the read address */
 
   outb(0, MMD(base));			/* Required dummy write */
@@ -311,21 +311,21 @@ mmc_in(u_long	base,
 }
 
 /*------------------------------------------------------------------*/
 /*
  * Routine to read bytes from the Modem Management Controller.
  * The implementation is complicated by a lack of address lines,
  * which prevents decoding of the low-order bit.
  * (code has just been moved in the above function)
  * We start by the end because it is the way it should be !
  */
-static inline void
+static void
 mmc_read(u_long		base,
 	 u_char		o,
 	 u_char *	b,
 	 int		n)
 {
   o += n;
   b += n;
 
   while(n-- > 0)
     *(--b) = mmc_in(base, --o);
@@ -343,23 +343,22 @@ mmc_encr(u_long		base)	/* i/o port of th
   temp = mmc_in(base, mmroff(0, mmr_des_avail));
   if((temp != MMR_DES_AVAIL_DES) && (temp != MMR_DES_AVAIL_AES))
     return 0;
   else
     return temp;
 }
 
 /*------------------------------------------------------------------*/
 /*
  * Wait for the frequency EEprom to complete a command...
- * I hope this one will be optimally inlined...
  */
-static inline void
+static void
 fee_wait(u_long		base,	/* i/o port of the card */
 	 int		delay,	/* Base delay to wait for */
 	 int		number)	/* Number of time to wait */
 {
   int		count = 0;	/* Wait only a limited time */
 
   while((count++ < number) &&
 	(mmc_in(base, mmroff(0, mmr_fee_status)) & MMR_FEE_STATUS_BUSY))
     udelay(delay);
 }
@@ -731,23 +730,23 @@ static void wv_roam_handover(wavepoint_h
   mmc_write(base, (char *)&m.w.mmw_netw_id_l - (char *)&m, (unsigned char *)&m.w.mmw_netw_id_l, 2);
   
   /* ReEnable interrupts & restore flags */
   spin_unlock_irqrestore(&lp->spinlock, flags);
 
   wv_nwid_filter(!NWID_PROMISC,lp);
   lp->curr_point=wavepoint;
 }
 
 /* Called when a WavePoint beacon is received */
-static inline void wl_roam_gather(struct net_device *  dev,
-				  u_char *  hdr,   /* Beacon header */
-				  u_char *  stats) /* SNR, Signal quality 
+static void wl_roam_gather(struct net_device *  dev,
+			   u_char *  hdr,   /* Beacon header */
+			   u_char *  stats) /* SNR, Signal quality 
 						      of packet */
 {
   wavepoint_beacon *beacon= (wavepoint_beacon *)hdr; /* Rcvd. Beacon */
   unsigned short nwid=ntohs(beacon->nwid);  
   unsigned short sigqual=stats[2] & MMR_SGNL_QUAL;   /* SNR of beacon */
   wavepoint_history *wavepoint=NULL;                /* WavePoint table entry */
   net_local *lp = netdev_priv(dev);              /* Device info */
 
 #ifdef I_NEED_THIS_FEATURE
   /* Some people don't need this, some other may need it */
@@ -787,21 +786,21 @@ static inline void wl_roam_gather(struct
       wv_nwid_filter(!NWID_PROMISC,lp);
   
 out:
   lp->wavepoint_table.locked=0;                        /* </MUTEX>   :-) */
 }
 
 /* Test this MAC frame a WavePoint beacon */
 static inline int WAVELAN_BEACON(unsigned char *data)
 {
   wavepoint_beacon *beacon= (wavepoint_beacon *)data;
-  static wavepoint_beacon beacon_template={0xaa,0xaa,0x03,0x08,0x00,0x0e,0x20,0x03,0x00};
+  static const wavepoint_beacon beacon_template={0xaa,0xaa,0x03,0x08,0x00,0x0e,0x20,0x03,0x00};
   
   if(memcmp(beacon,&beacon_template,9)==0)
     return 1;
   else
     return 0;
 }
 #endif	/* WAVELAN_ROAMING */
 
 /************************ I82593 SUBROUTINES *************************/
 /*
@@ -973,21 +972,21 @@ read_ringbuf(struct net_device *	dev,
 
 /*------------------------------------------------------------------*/
 /*
  * Reconfigure the i82593, or at least ask for it...
  * Because wv_82593_config use the transmission buffer, we must do it
  * when we are sure that there is no transmission, so we do it now
  * or in wavelan_packet_xmit() (I can't find any better place,
  * wavelan_interrupt is not an option...), so you may experience
  * some delay sometime...
  */
-static inline void
+static void
 wv_82593_reconfig(struct net_device *	dev)
 {
   net_local *		lp = netdev_priv(dev);
   struct pcmcia_device *		link = lp->link;
   unsigned long		flags;
 
   /* Arm the flag, will be cleard in wv_82593_config() */
   lp->reconfig_82593 = TRUE;
 
   /* Check if we can do it now ! */
@@ -1226,21 +1225,21 @@ wv_local_show(struct net_device *	dev)
    */
   printk("\n");
 } /* wv_local_show */
 #endif	/* DEBUG_DEVICE_SHOW */
 
 #if defined(DEBUG_RX_INFO) || defined(DEBUG_TX_INFO)
 /*------------------------------------------------------------------*/
 /*
  * Dump packet header (and content if necessary) on the screen
  */
-static inline void
+static void
 wv_packet_info(u_char *		p,		/* Packet to dump */
 	       int		length,		/* Length of the packet */
 	       char *		msg1,		/* Name of the device */
 	       char *		msg2)		/* Name of the function */
 {
   int		i;
   int		maxi;
   DECLARE_MAC_BUF(mac);
 
   printk(KERN_DEBUG "%s: %s(): dest %s, length %d\n",
@@ -1265,21 +1264,21 @@ wv_packet_info(u_char *		p,		/* Packet t
   printk(KERN_DEBUG "\n");
 #endif	/* DEBUG_PACKET_DUMP */
 }
 #endif	/* defined(DEBUG_RX_INFO) || defined(DEBUG_TX_INFO) */
 
 /*------------------------------------------------------------------*/
 /*
  * This is the information which is displayed by the driver at startup
  * There  is a lot of flag to configure it at your will...
  */
-static inline void
+static void
 wv_init_info(struct net_device *	dev)
 {
   unsigned int	base = dev->base_addr;
   psa_t		psa;
   DECLARE_MAC_BUF(mac);
 
   /* Read the parameter storage area */
   psa_read(dev, 0, (unsigned char *) &psa, sizeof(psa));
 
 #ifdef DEBUG_PSA_SHOW
@@ -1502,21 +1501,21 @@ wavelan_set_mac_address(struct net_devic
   return 0;
 }
 #endif	/* SET_MAC_ADDRESS */
 
 
 /*------------------------------------------------------------------*/
 /*
  * Frequency setting (for hardware able of it)
  * It's a bit complicated and you don't really want to look into it...
  */
-static inline int
+static int
 wv_set_frequency(u_long		base,	/* i/o port of the card */
 		 iw_freq *	frequency)
 {
   const int	BAND_NUM = 10;	/* Number of bands */
   long		freq = 0L;	/* offset to 2.4 GHz in .5 MHz */
 #ifdef DEBUG_IOCTL_INFO
   int		i;
 #endif
 
   /* Setting by frequency */
@@ -1699,21 +1698,21 @@ wv_set_frequency(u_long		base,	/* i/o po
       return 0;
     }
   else
     return -EINVAL;		/* Bah, never get there... */
 }
 
 /*------------------------------------------------------------------*/
 /*
  * Give the list of available frequencies
  */
-static inline int
+static int
 wv_frequency_list(u_long	base,	/* i/o port of the card */
 		  iw_freq *	list,	/* List of frequency to fill */
 		  int		max)	/* Maximum number of frequencies */
 {
   u_short	table[10];	/* Authorized frequency table */
   long		freq = 0L;	/* offset to 2.4 GHz in .5 MHz + 12 MHz */
   int		i;		/* index in the table */
   const int	BAND_NUM = 10;	/* Number of bands */
   int		c = 0;		/* Channel number */
 
@@ -2752,21 +2751,21 @@ wavelan_get_wireless_stats(struct net_de
  * The interrupt handler get an interrupt when a packet has been
  * successfully received and called this part...
  */
 
 /*------------------------------------------------------------------*/
 /*
  * Calculate the starting address of the frame pointed to by the receive
  * frame pointer and verify that the frame seem correct
  * (called by wv_packet_rcv())
  */
-static inline int
+static int
 wv_start_of_frame(struct net_device *	dev,
 		  int		rfp,	/* end of frame */
 		  int		wrap)	/* start of buffer */
 {
   unsigned int	base = dev->base_addr;
   int		rp;
   int		len;
 
   rp = (rfp - 5 + RX_SIZE) % RX_SIZE;
   outb(rp & 0xff, PIORL(base));
@@ -2814,21 +2813,21 @@ wv_start_of_frame(struct net_device *	de
  * header structure) from the WaveLAN card to an sk_buff chain that
  * will be passed up to the network interface layer. NOTE: We
  * currently don't handle trailer protocols (neither does the rest of
  * the network interface), so if that is needed, it will (at least in
  * part) be added here.  The contents of the receive ring buffer are
  * copied to a message chain that is then passed to the kernel.
  *
  * Note: if any errors occur, the packet is "dropped on the floor"
  * (called by wv_packet_rcv())
  */
-static inline void
+static void
 wv_packet_read(struct net_device *		dev,
 	       int		fd_p,
 	       int		sksize)
 {
   net_local *		lp = netdev_priv(dev);
   struct sk_buff *	skb;
 
 #ifdef DEBUG_RX_TRACE
   printk(KERN_DEBUG "%s: ->wv_packet_read(0x%X, %d)\n",
 	 dev->name, fd_p, sksize);
@@ -2915,21 +2914,21 @@ wv_packet_read(struct net_device *		dev,
 /*
  * This routine is called by the interrupt handler to initiate a
  * packet transfer from the card to the network interface layer above
  * this driver.  This routine checks if a buffer has been successfully
  * received by the WaveLAN card.  If so, the routine wv_packet_read is
  * called to do the actual transfer of the card's data including the
  * ethernet header into a packet consisting of an sk_buff chain.
  * (called by wavelan_interrupt())
  * Note : the spinlock is already grabbed for us and irq are disabled.
  */
-static inline void
+static void
 wv_packet_rcv(struct net_device *	dev)
 {
   unsigned int	base = dev->base_addr;
   net_local *	lp = netdev_priv(dev);
   int		newrfp;
   int		rp;
   int		len;
   int		f_start;
   int		status;
   int		i593_rfp;
@@ -3049,21 +3048,21 @@ wv_packet_rcv(struct net_device *	dev)
  * checked in wavelan_interrupt()
  */
 
 /*------------------------------------------------------------------*/
 /*
  * This routine fills in the appropriate registers and memory
  * locations on the WaveLAN card and starts the card off on
  * the transmit.
  * (called in wavelan_packet_xmit())
  */
-static inline void
+static void
 wv_packet_write(struct net_device *	dev,
 		void *		buf,
 		short		length)
 {
   net_local *		lp = netdev_priv(dev);
   unsigned int		base = dev->base_addr;
   unsigned long		flags;
   int			clen = length;
   register u_short	xmtdata_base = TX_BASE;
 
@@ -3173,21 +3172,21 @@ wavelan_packet_xmit(struct sk_buff *	skb
 /********************** HARDWARE CONFIGURATION **********************/
 /*
  * This part do the real job of starting and configuring the hardware.
  */
 
 /*------------------------------------------------------------------*/
 /*
  * Routine to initialize the Modem Management Controller.
  * (called by wv_hw_config())
  */
-static inline int
+static int
 wv_mmc_init(struct net_device *	dev)
 {
   unsigned int	base = dev->base_addr;
   psa_t		psa;
   mmw_t		m;
   int		configured;
   int		i;		/* Loop counter */
 
 #ifdef DEBUG_CONFIG_TRACE
   printk(KERN_DEBUG "%s: ->wv_mmc_init()\n", dev->name);
@@ -3692,21 +3691,21 @@ wv_82593_config(struct net_device *	dev)
 
 /*------------------------------------------------------------------*/
 /*
  * Read the Access Configuration Register, perform a software reset,
  * and then re-enable the card's software.
  *
  * If I understand correctly : reset the pcmcia interface of the
  * wavelan.
  * (called by wv_config())
  */
-static inline int
+static int
 wv_pcmcia_reset(struct net_device *	dev)
 {
   int		i;
   conf_reg_t	reg = { 0, CS_READ, CISREG_COR, 0 };
   struct pcmcia_device *	link = ((net_local *)netdev_priv(dev))->link;
 
 #ifdef DEBUG_CONFIG_TRACE
   printk(KERN_DEBUG "%s: ->wv_pcmcia_reset()\n", dev->name);
 #endif
 
@@ -3857,21 +3856,21 @@ wv_hw_config(struct net_device *	dev)
 }
 
 /*------------------------------------------------------------------*/
 /*
  * Totally reset the wavelan and restart it.
  * Performs the following actions:
  * 	1. Call wv_hw_config()
  *	2. Start the LAN controller's receive unit
  * (called by wavelan_event(), wavelan_watchdog() and wavelan_open())
  */
-static inline void
+static void
 wv_hw_reset(struct net_device *	dev)
 {
   net_local *	lp = netdev_priv(dev);
 
 #ifdef DEBUG_CONFIG_TRACE
   printk(KERN_DEBUG "%s: ->wv_hw_reset()\n", dev->name);
 #endif
 
   lp->nresets++;
   lp->configured = 0;
@@ -3888,21 +3887,21 @@ wv_hw_reset(struct net_device *	dev)
 #endif
 }
 
 /*------------------------------------------------------------------*/
 /*
  * wv_pcmcia_config() is called after a CARD_INSERTION event is
  * received, to configure the PCMCIA socket, and to make the ethernet
  * device available to the system.
  * (called by wavelan_event())
  */
-static inline int
+static int
 wv_pcmcia_config(struct pcmcia_device *	link)
 {
   struct net_device *	dev = (struct net_device *) link->priv;
   int			i;
   win_req_t		req;
   memreq_t		mem;
   net_local *		lp = netdev_priv(dev);
 
 
 #ifdef DEBUG_CONFIG_TRACE
diff -urp -U 10 linux-2.6/drivers/net/wireless/wavelan_cs.p.h linux-2.6.inline/drivers/net/wireless/wavelan_cs.p.h
--- linux-2.6/drivers/net/wireless/wavelan_cs.p.h	2008-03-30 03:27:46.000000000 +0200
+++ linux-2.6.inline/drivers/net/wireless/wavelan_cs.p.h	2008-04-01 02:46:19.000000000 +0200
@@ -630,46 +630,46 @@ struct net_local
   wavepoint_history *	curr_point;		/* Current wavepoint */
   int			cell_search;		/* Searching for new cell? */
   struct timer_list	cell_timer;		/* Garbage collection */
 #endif	/* WAVELAN_ROAMING */
   void __iomem *mem;
 };
 
 /* ----------------- MODEM MANAGEMENT SUBROUTINES ----------------- */
 static inline u_char		/* data */
 	hasr_read(u_long);	/* Read the host interface : base address */
-static inline void
+static void
 	hacr_write(u_long,	/* Write to host interface : base address */
 		   u_char),	/* data */
 	hacr_write_slow(u_long,
 		   u_char);
 static void
 	psa_read(struct net_device *,	/* Read the Parameter Storage Area */
 		 int,		/* offset in PSA */
 		 u_char *,	/* buffer to fill */
 		 int),		/* size to read */
 	psa_write(struct net_device *,	/* Write to the PSA */
 		  int,		/* Offset in psa */
 		  u_char *,	/* Buffer in memory */
 		  int);		/* Length of buffer */
-static inline void
+static void
 	mmc_out(u_long,		/* Write 1 byte to the Modem Manag Control */
 		u_short,
 		u_char),
 	mmc_write(u_long,	/* Write n bytes to the MMC */
 		  u_char,
 		  u_char *,
 		  int);
-static inline u_char		/* Read 1 byte from the MMC */
+static u_char			/* Read 1 byte from the MMC */
 	mmc_in(u_long,
 	       u_short);
-static inline void
+static void
 	mmc_read(u_long,	/* Read n bytes from the MMC */
 		 u_char,
 		 u_char *,
 		 int),
 	fee_wait(u_long,	/* Wait for frequency EEprom : base address */
 		 int,		/* Base delay to wait for */
 		 int);		/* Number of time to wait */
 static void
 	fee_read(u_long,	/* Read the frequency EEprom : base address */
 		 u_short,	/* destination offset */
@@ -681,63 +681,63 @@ static int
 		     char *,
 		     int,
 		     int);
 static inline int
 	wv_diag(struct net_device *);	/* Diagnostique the i82593 */
 static int
 	read_ringbuf(struct net_device *,	/* Read a receive buffer */
 		     int,
 		     char *,
 		     int);
-static inline void
+static void
 	wv_82593_reconfig(struct net_device *);	/* Reconfigure the controller */
 /* ------------------- DEBUG & INFO SUBROUTINES ------------------- */
-static inline void
+static void
 	wv_init_info(struct net_device *);	/* display startup info */
 /* ------------------- IOCTL, STATS & RECONFIG ------------------- */
 static en_stats	*
 	wavelan_get_stats(struct net_device *);	/* Give stats /proc/net/dev */
 static iw_stats *
 	wavelan_get_wireless_stats(struct net_device *);
 /* ----------------------- PACKET RECEPTION ----------------------- */
-static inline int
+static int
 	wv_start_of_frame(struct net_device *,	/* Seek beggining of current frame */
 			  int,	/* end of frame */
 			  int);	/* start of buffer */
-static inline void
+static void
 	wv_packet_read(struct net_device *,	/* Read a packet from a frame */
 		       int,
 		       int),
 	wv_packet_rcv(struct net_device *);	/* Read all packets waiting */
 /* --------------------- PACKET TRANSMISSION --------------------- */
-static inline void
+static void
 	wv_packet_write(struct net_device *,	/* Write a packet to the Tx buffer */
 			void *,
 			short);
 static int
 	wavelan_packet_xmit(struct sk_buff *,	/* Send a packet */
 			    struct net_device *);
 /* -------------------- HARDWARE CONFIGURATION -------------------- */
-static inline int
+static int
 	wv_mmc_init(struct net_device *);	/* Initialize the modem */
 static int
 	wv_ru_stop(struct net_device *),	/* Stop the i82593 receiver unit */
 	wv_ru_start(struct net_device *);	/* Start the i82593 receiver unit */
 static int
 	wv_82593_config(struct net_device *);	/* Configure the i82593 */
-static inline int
+static int
 	wv_pcmcia_reset(struct net_device *);	/* Reset the pcmcia interface */
 static int
 	wv_hw_config(struct net_device *);	/* Reset & configure the whole hardware */
-static inline void
+static void
 	wv_hw_reset(struct net_device *);	/* Same, + start receiver unit */
-static inline int
+static int
 	wv_pcmcia_config(struct pcmcia_device *);	/* Configure the pcmcia interface */
 static void
 	wv_pcmcia_release(struct pcmcia_device *);/* Remove a device */
 /* ---------------------- INTERRUPT HANDLING ---------------------- */
 static irqreturn_t
 	wavelan_interrupt(int,	/* Interrupt handler */
 			  void *);
 static void
 	wavelan_watchdog(struct net_device *);	/* Transmission watchdog */
 /* ------------------- CONFIGURATION CALLBACKS ------------------- */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-04-01  0:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-01  0:56 [PATCH] wavelan_cs: stop inlining largish static functions Denys Vlasenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.