Em Seg, 2005-08-15 às 19:57 +0200, Jean Delvare escreveu:
> Hi all,
>
> I2C_DEVNAME and i2c_clientname were introduced in 2.5.68 [1] to help
> media/video driver authors who wanted their code to be compatible with
> both Linux 2.4 and 2.6. The cause of the incompatibility has gone since
> [2], so I think we can get rid of them, as they tend to make the code
> harder to read and longer to preprocess/compile for no more benefit.
>
> I'd hope nobody seriously attempts to keep media/video driver compatible
> across Linux trees anymore, BTW.
That's not true. We keep V4L tree compatible with older kernel
releases. Each change like this does generate a lot of work at V4L side
to provide #ifdefs to check for linux version and provide a compatible
way to compile with older versions. I don't see any sense on applying
this patch, since it will not reduce code size or increase execution
time.
Mauro.
>
> [1] http://marc.theaimsgroup.com/?l=linux-kernel&m=104930186524598&w=2
> [2] http://www.linuxhq.com/kernel/v2.6/0-test3/include/linux/i2c.h
>
> This patch is meant to reach -mm through Greg's i2c tree.
>
> Thanks.
>
> Signed-off-by: Jean Delvare <[email protected]>
>
> drivers/media/video/bt832.c | 2
> drivers/media/video/bttv-i2c.c | 8 ++--
> drivers/media/video/cx88/cx88-i2c.c | 8 ++--
> drivers/media/video/ir-kbd-i2c.c | 2
> drivers/media/video/msp3400.c | 4 +-
> drivers/media/video/ovcamchip/ovcamchip_core.c | 6 ++--
> drivers/media/video/saa7134/saa6752hs.c | 2
> drivers/media/video/saa7134/saa7134-i2c.c | 6 ++--
> drivers/media/video/tda7432.c | 2
> drivers/media/video/tda9840.c | 2
> drivers/media/video/tda9875.c | 2
> drivers/media/video/tda9887.c | 2
> drivers/media/video/tea6415c.c | 2
> drivers/media/video/tea6420.c | 2
> drivers/media/video/tuner-core.c | 2
> drivers/media/video/tvaudio.c | 41 ++++++++++++-------------
> drivers/media/video/tvmixer.c | 8 ++--
> drivers/media/video/zoran_card.c | 2
> drivers/usb/media/w9968cf.c | 8 ++---
> include/linux/i2c.h | 7 ----
> 20 files changed, 53 insertions(+), 65 deletions(-)
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/bt832.c 2005-08-11 23:10:47.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/bt832.c 2005-08-12 21:22:45.000000000 +0200
> @@ -241,7 +241,7 @@
> };
> static struct i2c_client client_template =
> {
> - I2C_DEVNAME("bt832"),
> + .name = "bt832",
> .flags = I2C_CLIENT_ALLOW_USE,
> .driver = &driver,
> };
> --- linux-2.6.13-rc6.orig/drivers/media/video/bttv-i2c.c 2005-08-11 23:10:47.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/bttv-i2c.c 2005-08-12 21:22:45.000000000 +0200
> @@ -109,7 +109,7 @@
> #ifdef I2C_CLASS_TV_ANALOG
> .class = I2C_CLASS_TV_ANALOG,
> #endif
> - I2C_DEVNAME("bt848"),
> + .name = "bt848",
> .id = I2C_HW_B_BT848,
> .client_register = attach_inform,
> };
> @@ -280,7 +280,7 @@
> #ifdef I2C_CLASS_TV_ANALOG
> .class = I2C_CLASS_TV_ANALOG,
> #endif
> - I2C_DEVNAME("bt878"),
> + .name = "bt878",
> .id = I2C_HW_B_BT848 /* FIXME */,
> .algo = &bttv_algo,
> .client_register = attach_inform,
> @@ -296,7 +296,7 @@
> if (bttv_debug)
> printk(KERN_DEBUG "bttv%d: %s i2c attach [addr=0x%x,client=%s]\n",
> btv->c.nr,client->driver->name,client->addr,
> - i2c_clientname(client));
> + client->name);
> if (!client->driver->command)
> return 0;
>
> @@ -324,7 +324,7 @@
> }
>
> static struct i2c_client bttv_i2c_client_template = {
> - I2C_DEVNAME("bttv internal"),
> + .name = "bttv internal",
> };
>
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/ir-kbd-i2c.c 2005-08-11 23:10:48.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/ir-kbd-i2c.c 2005-08-12 21:22:45.000000000 +0200
> @@ -308,7 +308,7 @@
>
> static struct i2c_client client_template =
> {
> - I2C_DEVNAME("unset"),
> + .name = "unset",
> .driver = &driver
> };
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/msp3400.c 2005-08-09 19:26:35.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/msp3400.c 2005-08-12 21:22:45.000000000 +0200
> @@ -1437,7 +1437,7 @@
>
> static struct i2c_client client_template =
> {
> - I2C_DEVNAME("(unset)"),
> + .name = "(unset)",
> .flags = I2C_CLIENT_ALLOW_USE,
> .driver = &driver,
> };
> @@ -1509,7 +1509,7 @@
> }
>
> /* hello world :-) */
> - printk(KERN_INFO "msp34xx: init: chip=%s",i2c_clientname(c));
> + printk(KERN_INFO "msp34xx: init: chip=%s", c->name);
> if (HAVE_NICAM(msp))
> printk(" +nicam");
> if (HAVE_SIMPLE(msp))
> --- linux-2.6.13-rc6.orig/drivers/usb/media/w9968cf.c 2005-08-11 23:10:47.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/usb/media/w9968cf.c 2005-08-12 21:22:45.000000000 +0200
> @@ -1523,7 +1523,6 @@
> static int w9968cf_i2c_attach_inform(struct i2c_client* client)
> {
> struct w9968cf_device* cam = i2c_get_adapdata(client->adapter);
> - const char* clientname = i2c_clientname(client);
> int id = client->driver->id, err = 0;
>
> if (id == I2C_DRIVERID_OVCAMCHIP) {
> @@ -1535,12 +1534,12 @@
> }
> } else {
> DBG(4, "Rejected client [%s] with driver [%s]",
> - clientname, client->driver->name)
> + client->name, client->driver->name)
> return -EINVAL;
> }
>
> DBG(5, "I2C attach client [%s] with driver [%s]",
> - clientname, client->driver->name)
> + client->name, client->driver->name)
>
> return 0;
> }
> @@ -1549,12 +1548,11 @@
> static int w9968cf_i2c_detach_inform(struct i2c_client* client)
> {
> struct w9968cf_device* cam = i2c_get_adapdata(client->adapter);
> - const char* clientname = i2c_clientname(client);
>
> if (cam->sensor_client == client)
> cam->sensor_client = NULL;
>
> - DBG(5, "I2C detach client [%s]", clientname)
> + DBG(5, "I2C detach client [%s]", client->name)
>
> return 0;
> }
> --- linux-2.6.13-rc6.orig/drivers/media/video/cx88/cx88-i2c.c 2005-08-09 19:26:35.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/cx88/cx88-i2c.c 2005-08-12 21:22:45.000000000 +0200
> @@ -95,7 +95,7 @@
> struct cx88_core *core = i2c_get_adapdata(client->adapter);
>
> dprintk(1, "%s i2c attach [addr=0x%x,client=%s]\n",
> - client->driver->name,client->addr,i2c_clientname(client));
> + client->driver->name, client->addr, client->name);
> if (!client->driver->command)
> return 0;
>
> @@ -128,7 +128,7 @@
> {
> struct cx88_core *core = i2c_get_adapdata(client->adapter);
>
> - dprintk(1, "i2c detach [client=%s]\n", i2c_clientname(client));
> + dprintk(1, "i2c detach [client=%s]\n", client->name);
> return 0;
> }
>
> @@ -152,7 +152,7 @@
> /* ----------------------------------------------------------------------- */
>
> static struct i2c_adapter cx8800_i2c_adap_template = {
> - I2C_DEVNAME("cx2388x"),
> + .name = "cx2388x",
> .owner = THIS_MODULE,
> .id = I2C_HW_B_CX2388x,
> .client_register = attach_inform,
> @@ -160,7 +160,7 @@
> };
>
> static struct i2c_client cx8800_i2c_client_template = {
> - I2C_DEVNAME("cx88xx internal"),
> + .name = "cx88xx internal",
> };
>
> static char *i2c_devs[128] = {
> --- linux-2.6.13-rc6.orig/drivers/media/video/ovcamchip/ovcamchip_core.c 2005-08-11 23:10:47.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/ovcamchip/ovcamchip_core.c 2005-08-12 21:22:45.000000000 +0200
> @@ -314,7 +314,7 @@
> }
> memcpy(c, &client_template, sizeof *c);
> c->adapter = adap;
> - strcpy(i2c_clientname(c), "OV????");
> + strcpy(c->name, "OV????");
>
> ov = kmalloc(sizeof *ov, GFP_KERNEL);
> if (!ov) {
> @@ -328,7 +328,7 @@
> if (rc < 0)
> goto error;
>
> - strcpy(i2c_clientname(c), chip_names[ov->subtype]);
> + strcpy(c->name, chip_names[ov->subtype]);
>
> PDEBUG(1, "Camera chip detection complete");
>
> @@ -421,7 +421,7 @@
> };
>
> static struct i2c_client client_template = {
> - I2C_DEVNAME("(unset)"),
> + .name = "(unset)",
> .driver = &driver,
> };
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/saa7134/saa6752hs.c 2005-08-09 19:26:35.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/saa7134/saa6752hs.c 2005-08-12 21:22:45.000000000 +0200
> @@ -598,7 +598,7 @@
>
> static struct i2c_client client_template =
> {
> - I2C_DEVNAME("saa6752hs"),
> + .name = "saa6752hs",
> .flags = I2C_CLIENT_ALLOW_USE,
> .driver = &driver,
> };
> --- linux-2.6.13-rc6.orig/drivers/media/video/saa7134/saa7134-i2c.c 2005-08-11 23:10:48.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/saa7134/saa7134-i2c.c 2005-08-12 21:22:45.000000000 +0200
> @@ -334,7 +334,7 @@
> struct tuner_setup tun_setup;
>
> d1printk( "%s i2c attach [addr=0x%x,client=%s]\n",
> - client->driver->name,client->addr,i2c_clientname(client));
> + client->driver->name, client->addr, client->name);
>
> if (!client->driver->command)
> return 0;
> @@ -380,14 +380,14 @@
> #ifdef I2C_CLASS_TV_ANALOG
> .class = I2C_CLASS_TV_ANALOG,
> #endif
> - I2C_DEVNAME("saa7134"),
> + .name = "saa7134",
> .id = I2C_HW_SAA7134,
> .algo = &saa7134_algo,
> .client_register = attach_inform,
> };
>
> static struct i2c_client saa7134_client_template = {
> - I2C_DEVNAME("saa7134 internal"),
> + .name = "saa7134 internal",
> };
>
> /* ----------------------------------------------------------- */
> --- linux-2.6.13-rc6.orig/drivers/media/video/tda7432.c 2005-08-11 23:10:47.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tda7432.c 2005-08-12 21:22:45.000000000 +0200
> @@ -513,7 +513,7 @@
>
> static struct i2c_client client_template =
> {
> - I2C_DEVNAME("tda7432"),
> + .name = "tda7432",
> .driver = &driver,
> };
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/tda9840.c 2005-08-11 23:10:48.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tda9840.c 2005-08-12 21:22:45.000000000 +0200
> @@ -231,7 +231,7 @@
> };
>
> static struct i2c_client client_template = {
> - I2C_DEVNAME("tda9840"),
> + .name = "tda9840",
> .driver = &driver,
> };
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/tda9875.c 2005-08-11 23:10:47.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tda9875.c 2005-08-12 21:22:45.000000000 +0200
> @@ -384,7 +384,7 @@
>
> static struct i2c_client client_template =
> {
> - I2C_DEVNAME("tda9875"),
> + .name = "tda9875",
> .driver = &driver,
> };
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/tda9887.c 2005-08-11 23:10:48.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tda9887.c 2005-08-12 21:22:45.000000000 +0200
> @@ -793,7 +793,7 @@
> };
> static struct i2c_client client_template =
> {
> - I2C_DEVNAME("tda9887"),
> + .name = "tda9887",
> .flags = I2C_CLIENT_ALLOW_USE,
> .driver = &driver,
> };
> --- linux-2.6.13-rc6.orig/drivers/media/video/tea6415c.c 2005-08-11 23:10:48.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tea6415c.c 2005-08-12 21:22:45.000000000 +0200
> @@ -200,7 +200,7 @@
> };
>
> static struct i2c_client client_template = {
> - I2C_DEVNAME("tea6415c"),
> + .name = "tea6415c",
> .driver = &driver,
> };
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/tea6420.c 2005-08-11 23:10:48.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tea6420.c 2005-08-12 21:22:45.000000000 +0200
> @@ -177,7 +177,7 @@
> };
>
> static struct i2c_client client_template = {
> - I2C_DEVNAME("tea6420"),
> + .name = "tea6420",
> .driver = &driver,
> };
>
> --- linux-2.6.13-rc6.orig/drivers/media/video/tuner-core.c 2005-08-09 19:26:35.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tuner-core.c 2005-08-12 21:22:45.000000000 +0200
> @@ -709,7 +709,7 @@
> },
> };
> static struct i2c_client client_template = {
> - I2C_DEVNAME("(tuner unset)"),
> + .name = "(tuner unset)",
> .flags = I2C_CLIENT_ALLOW_USE,
> .driver = &driver,
> };
> --- linux-2.6.13-rc6.orig/drivers/media/video/tvaudio.c 2005-08-11 23:10:48.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tvaudio.c 2005-08-12 21:22:45.000000000 +0200
> @@ -162,24 +162,23 @@
> unsigned char buffer[2];
>
> if (-1 == subaddr) {
> - dprintk("%s: chip_write: 0x%x\n",
> - i2c_clientname(&chip->c), val);
> + dprintk("%s: chip_write: 0x%x\n", chip->c.name, val);
> chip->shadow.bytes[1] = val;
> buffer[0] = val;
> if (1 != i2c_master_send(&chip->c,buffer,1)) {
> printk(KERN_WARNING "%s: I/O error (write 0x%x)\n",
> - i2c_clientname(&chip->c), val);
> + chip->c.name, val);
> return -1;
> }
> } else {
> dprintk("%s: chip_write: reg%d=0x%x\n",
> - i2c_clientname(&chip->c), subaddr, val);
> + chip->c.name, subaddr, val);
> chip->shadow.bytes[subaddr+1] = val;
> buffer[0] = subaddr;
> buffer[1] = val;
> if (2 != i2c_master_send(&chip->c,buffer,2)) {
> printk(KERN_WARNING "%s: I/O error (write reg%d=0x%x)\n",
> - i2c_clientname(&chip->c), subaddr, val);
> + chip->c.name, subaddr, val);
> return -1;
> }
> }
> @@ -203,11 +202,10 @@
> unsigned char buffer;
>
> if (1 != i2c_master_recv(&chip->c,&buffer,1)) {
> - printk(KERN_WARNING "%s: I/O error (read)\n",
> - i2c_clientname(&chip->c));
> + printk(KERN_WARNING "%s: I/O error (read)\n", chip->c.name);
> return -1;
> }
> - dprintk("%s: chip_read: 0x%x\n",i2c_clientname(&chip->c),buffer);
> + dprintk("%s: chip_read: 0x%x\n", chip->c.name, buffer);
> return buffer;
> }
>
> @@ -222,12 +220,11 @@
> write[0] = subaddr;
>
> if (2 != i2c_transfer(chip->c.adapter,msgs,2)) {
> - printk(KERN_WARNING "%s: I/O error (read2)\n",
> - i2c_clientname(&chip->c));
> + printk(KERN_WARNING "%s: I/O error (read2)\n", chip->c.name);
> return -1;
> }
> dprintk("%s: chip_read2: reg%d=0x%x\n",
> - i2c_clientname(&chip->c),subaddr,read[0]);
> + chip->c.name, subaddr, read[0]);
> return read[0];
> }
>
> @@ -240,7 +237,7 @@
>
> /* update our shadow register set; print bytes if (debug > 0) */
> dprintk("%s: chip_cmd(%s): reg=%d, data:",
> - i2c_clientname(&chip->c),name,cmd->bytes[0]);
> + chip->c.name, name, cmd->bytes[0]);
> for (i = 1; i < cmd->count; i++) {
> dprintk(" 0x%x",cmd->bytes[i]);
> chip->shadow.bytes[i+cmd->bytes[0]] = cmd->bytes[i];
> @@ -249,7 +246,7 @@
>
> /* send data to the chip */
> if (cmd->count != i2c_master_send(&chip->c,cmd->bytes,cmd->count)) {
> - printk(KERN_WARNING "%s: I/O error (%s)\n", i2c_clientname(&chip->c), name);
> + printk(KERN_WARNING "%s: I/O error (%s)\n", chip->c.name, name);
> return -1;
> }
> return 0;
> @@ -274,9 +271,9 @@
> struct CHIPSTATE *chip = data;
> struct CHIPDESC *desc = chiplist + chip->type;
>
> - daemonize("%s",i2c_clientname(&chip->c));
> + daemonize("%s", chip->c.name);
> allow_signal(SIGTERM);
> - dprintk("%s: thread started\n", i2c_clientname(&chip->c));
> + dprintk("%s: thread started\n", chip->c.name);
>
> for (;;) {
> add_wait_queue(&chip->wq, &wait);
> @@ -288,7 +285,7 @@
> try_to_freeze();
> if (chip->done || signal_pending(current))
> break;
> - dprintk("%s: thread wakeup\n", i2c_clientname(&chip->c));
> + dprintk("%s: thread wakeup\n", chip->c.name);
>
> /* don't do anything for radio or if mode != auto */
> if (chip->norm == VIDEO_MODE_RADIO || chip->mode != 0)
> @@ -301,7 +298,7 @@
> mod_timer(&chip->wt, jiffies+2*HZ);
> }
>
> - dprintk("%s: thread exiting\n", i2c_clientname(&chip->c));
> + dprintk("%s: thread exiting\n", chip->c.name);
> complete_and_exit(&chip->texit, 0);
> return 0;
> }
> @@ -314,7 +311,7 @@
> if (mode == chip->prevmode)
> return;
>
> - dprintk("%s: thread checkmode\n", i2c_clientname(&chip->c));
> + dprintk("%s: thread checkmode\n", chip->c.name);
> chip->prevmode = mode;
>
> if (mode & VIDEO_SOUND_STEREO)
> @@ -1501,7 +1498,7 @@
> (desc->flags & CHIP_HAS_INPUTSEL) ? " audiomux" : "");
>
> /* fill required data structures */
> - strcpy(i2c_clientname(&chip->c),desc->name);
> + strcpy(chip->c.name, desc->name);
> chip->type = desc-chiplist;
> chip->shadow.count = desc->registers+1;
> chip->prevmode = -1;
> @@ -1538,7 +1535,7 @@
> chip->tpid = kernel_thread(chip_thread,(void *)chip,0);
> if (chip->tpid < 0)
> printk(KERN_WARNING "%s: kernel_thread() failed\n",
> - i2c_clientname(&chip->c));
> + chip->c.name);
> wake_up_interruptible(&chip->wq);
> }
> return 0;
> @@ -1591,7 +1588,7 @@
> struct CHIPSTATE *chip = i2c_get_clientdata(client);
> struct CHIPDESC *desc = chiplist + chip->type;
>
> - dprintk("%s: chip_command 0x%x\n",i2c_clientname(&chip->c),cmd);
> + dprintk("%s: chip_command 0x%x\n", chip->c.name, cmd);
>
> switch (cmd) {
> case AUDC_SET_INPUT:
> @@ -1702,7 +1699,7 @@
>
> static struct i2c_client client_template =
> {
> - I2C_DEVNAME("(unset)"),
> + .name = "(unset)",
> .flags = I2C_CLIENT_ALLOW_USE,
> .driver = &driver,
> };
> --- linux-2.6.13-rc6.orig/drivers/media/video/tvmixer.c 2005-08-11 23:10:47.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/tvmixer.c 2005-08-12 21:22:45.000000000 +0200
> @@ -91,7 +91,7 @@
> if (cmd == SOUND_MIXER_INFO) {
> mixer_info info;
> strlcpy(info.id, "tv card", sizeof(info.id));
> - strlcpy(info.name, i2c_clientname(client), sizeof(info.name));
> + strlcpy(info.name, client->name, sizeof(info.name));
> info.modify_counter = 42 /* FIXME */;
> if (copy_to_user(argp, &info, sizeof(info)))
> return -EFAULT;
> @@ -100,7 +100,7 @@
> if (cmd == SOUND_OLD_MIXER_INFO) {
> _old_mixer_info info;
> strlcpy(info.id, "tv card", sizeof(info.id));
> - strlcpy(info.name, i2c_clientname(client), sizeof(info.name));
> + strlcpy(info.name, client->name, sizeof(info.name));
> if (copy_to_user(argp, &info, sizeof(info)))
> return -EFAULT;
> return 0;
> @@ -295,7 +295,7 @@
> devices[i].dev = NULL;
> devices[i].minor = -1;
> printk("tvmixer: %s unregistered (#1)\n",
> - i2c_clientname(client));
> + client->name);
> return 0;
> }
> }
> @@ -354,7 +354,7 @@
> if (devices[i].minor != -1) {
> unregister_sound_mixer(devices[i].minor);
> printk("tvmixer: %s unregistered (#2)\n",
> - i2c_clientname(devices[i].dev));
> + devices[i].dev->name);
> }
> }
> }
> --- linux-2.6.13-rc6.orig/drivers/media/video/zoran_card.c 2005-08-09 19:26:35.000000000 +0200
> +++ linux-2.6.13-rc6/drivers/media/video/zoran_card.c 2005-08-12 21:22:45.000000000 +0200
> @@ -737,7 +737,7 @@
> };
>
> static struct i2c_adapter zoran_i2c_adapter_template = {
> - I2C_DEVNAME("zr36057"),
> + .name = "zr36057",
> .id = I2C_HW_B_ZR36067,
> .algo = NULL,
> .client_register = zoran_i2c_client_register,
> --- linux-2.6.13-rc6.orig/include/linux/i2c.h 2005-08-11 23:10:47.000000000 +0200
> +++ linux-2.6.13-rc6/include/linux/i2c.h 2005-08-12 21:22:45.000000000 +0200
> @@ -178,13 +178,6 @@
> dev_set_drvdata (&dev->dev, data);
> }
>
> -#define I2C_DEVNAME(str) .name = str
> -
> -static inline char *i2c_clientname(struct i2c_client *c)
> -{
> - return &c->name[0];
> -}
> -
> /*
> * The following structs are for those who like to implement new bus drivers:
> * i2c_algorithm is the interface to a class of hardware solutions which can
>
>
Cheers,
Mauro.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
|
|