nslu2-kernel: add maclist proc entry to 2.6.14.3 and 2.6.15-rc2
authorJohn Bowler <jbowler@nslu2-linux.org>
Tue, 29 Nov 2005 03:02:31 +0000 (03:02 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Tue, 29 Nov 2005 03:02:31 +0000 (03:02 +0000)
packages/linux/nslu2-kernel/2.6.14/defconfig
packages/linux/nslu2-kernel/2.6.15/defconfig
packages/linux/nslu2-kernel/2.6/91-maclist.patch [new file with mode: 0644]
packages/linux/nslu2-kernel_2.6.14.3.bb
packages/linux/nslu2-kernel_2.6.15-rc2.bb

index 8d0d751..83b2521 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14-rc4
-# Fri Oct 21 16:13:58 2005
+# Linux kernel version: 2.6.14
+# Mon Nov 28 18:53:25 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -93,12 +93,12 @@ CONFIG_ARCH_SUPPORTS_BIG_ENDIAN=y
 #
 # IXP4xx Platforms
 #
+CONFIG_MACH_NSLU2=y
 # CONFIG_ARCH_AVILA is not set
 # CONFIG_ARCH_ADI_COYOTE is not set
 # CONFIG_ARCH_IXDP425 is not set
 # CONFIG_MACH_IXDPG425 is not set
 # CONFIG_MACH_IXDP465 is not set
-CONFIG_MACH_NSLU2=y
 # CONFIG_ARCH_PRPMC1100 is not set
 # CONFIG_MACH_GTWX5715 is not set
 
@@ -169,7 +169,6 @@ CONFIG_CMDLINE="root=/dev/mtdblock4 rw rootfstype=jffs2 mem=32M@0x00000000 init=
 # At least one emulation must be selected
 #
 CONFIG_FPE_NWFPE=y
-# CONFIG_FPE_NWFPE_XP is not set
 # CONFIG_FPE_FASTFPE is not set
 
 #
@@ -574,7 +573,13 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
 # CONFIG_SCSI_QLOGIC_1280 is not set
-CONFIG_SCSI_QLA2XXX=n
+CONFIG_SCSI_QLA2XXX=y
+# CONFIG_SCSI_QLA21XX is not set
+# CONFIG_SCSI_QLA22XX is not set
+# CONFIG_SCSI_QLA2300 is not set
+# CONFIG_SCSI_QLA2322 is not set
+# CONFIG_SCSI_QLA6312 is not set
+# CONFIG_SCSI_QLA24XX is not set
 # CONFIG_SCSI_LPFC is not set
 # CONFIG_SCSI_DC395x is not set
 # CONFIG_SCSI_DC390T is not set
@@ -642,6 +647,7 @@ CONFIG_TUN=m
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
+CONFIG_MACLIST=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
@@ -1120,7 +1126,6 @@ CONFIG_USB=y
 CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
 # CONFIG_USB_OTG is not set
 
 #
@@ -1369,7 +1374,6 @@ CONFIG_RAMFS=y
 #
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
-# CONFIG_ASFS_FS is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_HFSPLUS_FS is not set
 # CONFIG_BEFS_FS is not set
index 9a9bc34..7074421 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.15
-# Mon Nov 14 10:44:43 2005
+# Mon Nov 28 13:10:38 2005
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -410,6 +410,11 @@ CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=m
 
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
 #
 # Memory Technology Devices (MTD)
 #
@@ -673,6 +678,7 @@ CONFIG_TUN=m
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
+CONFIG_MACLIST=y
 CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
 # CONFIG_SUNGEM is not set
@@ -1029,6 +1035,8 @@ CONFIG_VIDEO_HEXIUM_GEMINI=m
 CONFIG_VIDEO_CX88=m
 # CONFIG_VIDEO_EM28XX is not set
 CONFIG_VIDEO_OVCAMCHIP=m
+# CONFIG_VIDEO_AUDIO_DECODER is not set
+# CONFIG_VIDEO_DECODER is not set
 
 #
 # Radio Adapters
@@ -1273,6 +1281,7 @@ CONFIG_USB_NET_ZAURUS=m
 CONFIG_USB_SERIAL=m
 CONFIG_USB_SERIAL_GENERIC=y
 # CONFIG_USB_SERIAL_AIRPRIME is not set
+# CONFIG_USB_SERIAL_ANYDATA is not set
 CONFIG_USB_SERIAL_BELKIN=m
 CONFIG_USB_SERIAL_WHITEHEAT=m
 CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
@@ -1292,7 +1301,6 @@ CONFIG_USB_SERIAL_KEYSPAN_PDA=m
 CONFIG_USB_SERIAL_KLSI=m
 CONFIG_USB_SERIAL_KOBIL_SCT=m
 CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NOKIA_DKU2 is not set
 CONFIG_USB_SERIAL_PL2303=m
 # CONFIG_USB_SERIAL_HP4X is not set
 CONFIG_USB_SERIAL_SAFE=m
diff --git a/packages/linux/nslu2-kernel/2.6/91-maclist.patch b/packages/linux/nslu2-kernel/2.6/91-maclist.patch
new file mode 100644 (file)
index 0000000..27af1ea
--- /dev/null
@@ -0,0 +1,377 @@
+--- linux-2.6.15/include/net/maclist.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.15/include/net/maclist.h 1970-01-01 00:00:00.000000000 +0000
+@@ -0,0 +1,23 @@
++#ifndef _MACLIST_H
++#define _MACLIST_H 1
++/*
++ * Interfaces to the MAC repository
++ */
++/*
++ * Add a single entry, returns 0 on success else an error
++ * code.  Must *not* be called from an interrupt handler.
++ */
++extern int maclist_add(const u8 id_to_add[6]);
++
++/*
++ * Return the current entry count (valid in any context).
++ */
++extern int maclist_count(void);
++
++/*
++ * Return the ID from the n'th entry (valid in any context),
++ * returns 0 on success, -EINVAL if 'n' is out of range.
++ */
++extern int maclist_read(u8 (*buffer_for_id)[6], int index_of_id_to_return);
++
++#endif /*_MACLIST_H*/
+--- linux-2.6.15/drivers/net/maclist.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.15/drivers/net/maclist.c 1970-01-01 00:00:00.000000000 +0000
+@@ -0,0 +1,314 @@
++/*
++ * drivers/net/maclist.c
++ *
++ * a simple driver to remember ethernet MAC values
++ *
++ * Some Ethernet hardware implementations have no built-in
++ * storage for allocated MAC values - an example is the Intel
++ * IXP420 chip which has support for Ethernet but no defined
++ * way of storing allocated MAC values.  With such hardware
++ * different board level implementations store the allocated
++ * MAC (or MACs) in different ways.  Rather than put board
++ * level code into a specific Ethernet driver this driver
++ * provides a generally accessible repository for the MACs
++ * which can be written by board level code and read by the
++ * driver.
++ *
++ * The implementation also allows user level programs to
++ * access the MAC information in /proc/net/maclist.  This is
++ * useful as it allows user space code to use the MAC if it
++ * is not used by a built-in driver.
++ *
++ * Copyright (C) 2005 John Bowler
++ * Author: John Bowler <jbowler@acm.org>
++ * Maintainers: http://www.nslu2-linux.org/
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * version 2 as published by the Free Software Foundation.
++ *
++ * External interfaces:
++ *  Interfaces to linux kernel (and modules)
++ *   maclist_add:   add a single MAC
++ *   maclist_count: total number of MACs stored
++ *   maclist_read:  read a MAC 0..(maclist_count-1)
++ */
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/etherdevice.h>
++#include <linux/proc_fs.h>
++#include <linux/errno.h>
++
++#include <net/maclist.h>
++
++#define MACLIST_NAME "maclist"
++
++MODULE_AUTHOR("John Bowler <jbowler@acm.org>");
++MODULE_DESCRIPTION("MAC list repository");
++MODULE_LICENSE("GPL");
++
++typedef struct maclist_entry {
++      struct maclist_entry *next;  /* Linked list, first first */
++      u8                    id[6]; /* 6 byte Ethernet MAC */
++} maclist_entry_t;
++
++/* Access to this list is possible at any time - entries in
++ * the list are never destroyed.  Modification of the list is
++ * safe only from the init code (i.e. modification must be
++ * single threaded), but read from an interrupt at the same
++ * time is possible and safe.
++ */
++static maclist_entry_t *maclist_list = 0;
++
++/*
++ * External interfaces.
++ *
++ * Add a single entry, returns 0 on success else an error
++ * code.  Must be single threaded.
++ */
++int maclist_add(const u8 new_id[6]) {
++      maclist_entry_t *new_entry, **tail;
++
++      if (new_id == 0 || !is_valid_ether_addr(new_id)) {
++              printk(KERN_ERR MACLIST_NAME ": invalid ethernet address\n");
++              return -EINVAL;
++      }
++      new_entry = kmalloc(sizeof *new_entry, GFP_KERNEL);
++      if (new_entry == 0)
++              return -ENOMEM;
++      new_entry->next = 0;
++      memcpy(new_entry->id, new_id, sizeof new_entry->id);
++
++      tail = &maclist_list;
++      while (*tail != 0)
++              tail = &(*tail)->next;
++      *tail = new_entry;
++      return 0;
++}
++EXPORT_SYMBOL(maclist_add);
++
++/*
++ * Return the current entry count (valid in any context).
++ */
++int maclist_count(void) {
++      maclist_entry_t *tail = maclist_list;
++      int count = 0;
++
++      while (tail != 0) {
++              tail = tail->next;
++              ++count;
++      }
++
++      return count;
++}
++EXPORT_SYMBOL(maclist_count);
++
++/*
++ * Return the ID from the n'th entry (valid in any context),
++ * returns 0 on success, -EINVAL if 'n' is out of range.
++ */
++int maclist_read(u8 (*id)[6], int n) {
++      maclist_entry_t *entry = maclist_list;
++
++      while (n > 0 && entry != 0) {
++              --n;
++              entry = entry->next;
++      }
++
++      if (n == 0 && entry != 0) {
++              memcpy(id, entry->id, sizeof *id);
++              return 0;
++      }
++
++      printk(KERN_ERR MACLIST_NAME ": id does not exist\n");
++      return -EINVAL;
++}
++EXPORT_SYMBOL(maclist_read);
++
++/*
++ * Parameter parsing.  The option string is a list of MAC
++ * addresses, comma separated.  (The parsing really should
++ * be somewhere central...)
++ */
++static int __init maclist_setup(char *param) {
++      int bytes = 0, seen_a_digit = 0;
++      u8 id[6];
++
++      memset(id, 0, sizeof id);
++
++      if (param) do {
++              int digit = -1;
++              switch (*param) {
++              case '0': digit = 0; break;
++              case '1': digit = 1; break;
++              case '2': digit = 2; break;
++              case '3': digit = 3; break;
++              case '4': digit = 4; break;
++              case '5': digit = 5; break;
++              case '6': digit = 6; break;
++              case '7': digit = 7; break;
++              case '8': digit = 8; break;
++              case '9': digit = 9; break;
++              case 'a': case 'A': digit = 10; break;
++              case 'b': case 'B': digit = 11; break;
++              case 'c': case 'C': digit = 12; break;
++              case 'd': case 'D': digit = 13; break;
++              case 'e': case 'E': digit = 14; break;
++              case 'f': case 'F': digit = 15; break;
++              case ':':
++                      if (seen_a_digit)
++                              bytes = (bytes+1) & ~1;
++                      else
++                              bytes += 2; /* i.e. ff::ff is ff:00:ff */
++                      seen_a_digit = 0;
++                      break;
++              case 0:
++                      if (bytes == 0) /* nothing new seen so far */
++                              return 0;
++                      /*fall through*/
++              case ',': case ';':
++                      if (bytes > 0)
++                              bytes = 12; /* i.e. all trailing bytes 0 */
++                      break;
++              default:
++                      printk(KERN_ERR MACLIST_NAME ": invalid character <%c[%d]>\n",
++                                      *param, *param);
++                      return -EINVAL;
++              }
++
++              if (digit >= 0) {
++                      id[bytes>>1] = (id[bytes>>1] << 4) + digit; break;
++                      ++bytes;
++                      seen_a_digit = 1;
++              }
++
++              if (bytes >= 12) {
++                      int rc = maclist_add(id);
++                      if (rc)
++                              return rc;
++                      bytes = 0;
++                      seen_a_digit = 0;
++                      memset(id, 0, sizeof id);
++                      if (*param == 0)
++                              return 0;
++              }
++              ++param;
++      } while (1);
++
++      return 0;
++}
++
++/*
++ * procfs support, if compiled in.
++ */
++#ifdef CONFIG_PROC_FS
++/*
++ * Character device read
++ */
++static int maclist_getchar(off_t n) {
++      static char xdigit[16] = "0123456789abcdef";
++      maclist_entry_t *head = maclist_list;
++      int b;
++
++      do {
++              if (head == 0)
++                      return -1;
++              if (n < 18)
++                      break;
++              head = head->next;
++              n -= 18;
++      } while (1);
++
++      if (n == 17)
++              return '\n';
++
++      b = n/3;
++      switch (n - b*3) {
++      case 0: return xdigit[head->id[b] >> 4];
++      case 1: return xdigit[head->id[b] & 0xf];
++      default: return ':';
++      }
++}
++
++/*
++ * The extensively undocumented proc_read_t callback is implemented here.
++ * Go look in fs/proc/generic.c:
++ *
++ * Prototype:
++ *    int f(char *buffer, char **start, off_t offset,
++ *          int count, int *peof, void *dat)
++ *
++ * Assume that the buffer is "count" bytes in size.
++ *
++ * 2) Set *start = an address within the buffer.
++ *    Put the data of the requested offset at *start.
++ *    Return the number of bytes of data placed there.
++ *    If this number is greater than zero and you
++ *    didn't signal eof and the reader is prepared to
++ *    take more data you will be called again with the
++ *    requested offset advanced by the number of bytes
++ *    absorbed.
++ */
++static int maclist_proc_read(char *buffer, char **start, off_t offset,
++              int count, int *peof, void *dat) {
++      int total;
++
++      *start = buffer;
++      total = 0;
++
++      while (total < count) {
++              int ch = maclist_getchar(offset++);
++              if (ch == -1) {
++                      *peof = 1;
++                      break;
++              }
++              *buffer++ = ch;
++              ++total;
++      }
++
++      return total;
++}
++#endif
++
++/*
++ * Finally, the init/exit functions.
++ */
++static void __exit maclist_exit(void)
++{
++      maclist_entry_t *list;
++
++      remove_proc_entry(MACLIST_NAME, proc_net);
++
++      list = maclist_list;
++      maclist_list = 0;
++
++      while (list != 0) {
++              maclist_entry_t *head = list;
++              list = head->next;
++              kfree(head);
++      }
++}
++
++#ifdef MODULE
++static char ids[256];
++module_param_string(ids, ids, sizeof ids, 0);
++MODULE_PARM_DESC(ids, "comma separated list of MAC ids\n");
++#else
++__setup("maclist_ids=", maclist_setup);
++#endif
++
++static int __init maclist_init(void)
++{
++#     ifdef MODULE
++              if (ids[0])
++                      maclist_setup(ids);
++#     endif
++
++      /* Ignore failure, the module will still work. */
++      (void)create_proc_read_entry(MACLIST_NAME, S_IRUGO, proc_net, maclist_proc_read, NULL);
++
++      return 0;
++}
++
++module_init(maclist_init);
++module_exit(maclist_exit);
+--- linux-2.6.15/drivers/net/Makefile  1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.15/drivers/net/Makefile  1970-01-01 00:00:00.000000000 +0000
+@@ -70,6 +70,7 @@ obj-$(CONFIG_RIONET) += rionet.o
+ # end link order section
+ #
++obj-$(CONFIG_MACLIST) += maclist.o
+ obj-$(CONFIG_MII) += mii.o
+ obj-$(CONFIG_PHYLIB) += phy/
+--- linux-2.6.15/drivers/net/Kconfig   1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.15/drivers/net/Kconfig   1970-01-01 00:00:00.000000000 +0000
+@@ -166,6 +166,21 @@ config NET_ETHERNET
+         kernel: saying N will just cause the configurator to skip all
+         the questions about Ethernet network cards. If unsure, say N.
++config MACLIST
++      tristate "Ethernet MAC repository"
++      depends on NET_ETHERNET
++      help
++        Some ethernet controllers have no built-in way of obtaining an
++        appropriate Ethernet MAC address.  Such controllers have to be
++        initialised in a board-specific way, depending on how the allocated
++        MAC is stored.  The MAC repository provides a set of APIs and a
++        proc entry (/proc/net/maclist) to store MAC values from the board
++        so that such drivers can obtain a MAC address without board-specific
++        code.  You do not need to enable this device - it will be selected
++        automatically by any device which requires it.  It is only useful
++        to enable it manually when building a device driver independently
++        of the kernel build.
++
+ config MII
+       tristate "Generic Media Independent Interface device support"
+       depends on NET_ETHERNET
index eca0862..71282bb 100644 (file)
@@ -8,7 +8,7 @@ PR_CONFIG = "0"
 # Increment the number below (i.e. the digits after PR) when
 # making changes within this file or for changes to the patches
 # applied to the kernel.
-PR = "r0.${PR_CONFIG}"
+PR = "r1.${PR_CONFIG}"
 
 include nslu2-kernel.inc
 
@@ -30,6 +30,7 @@ N2K_PATCHES = "\
        file://75-nslu2-leds.patch;patch=1 \
        file://90-pegasus.patch;patch=1 \
        file://20-timer.patch;patch=1 \
+       file://91-maclist.patch;patch=1 \
        file://anonymiser.patch;patch=1 \
 "
 
index d2b55c8..79f3827 100644 (file)
@@ -8,7 +8,7 @@ PR_CONFIG = "0"
 # Increment the number below (i.e. the digits after PR) when
 # making changes within this file or for changes to the patches
 # applied to the kernel.
-PR = "r0.${PR_CONFIG}"
+PR = "r1.${PR_CONFIG}"
 
 include nslu2-kernel.inc
 
@@ -25,6 +25,7 @@ N2K_PATCHES = "\
        file://81-nslu2-class-device-create.patch;patch=1 \
        file://90-ixp4xx-nslu2.patch;patch=1 \
        file://20-timer.patch;patch=1 \
+       file://91-maclist.patch;patch=1 \
        file://anonymiser.patch;patch=1 \
 "