From: Mateusz Berezecki <mateuszb@gmail.com>
To: kernel-mentors@selenic.com
Cc: netdev@vger.kernel.org
Subject: [patch 4/8] atheros driver - eeprom routines
Date: Fri, 5 Aug 2005 16:23:59 +0200 [thread overview]
Message-ID: <20050805142359.GA2576@ntjohd.mshome.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 47 bytes --]
resending patch 4/8 as it was reported missing
[-- Attachment #2: atheros5212-4.patch --]
[-- Type: text/plain, Size: 18628 bytes --]
diff -uprN -X 'netdev-2.6.git#ieee80211/Documentation/dontdiff' netdev-2.6.git#ieee80211/drivers/net/wireless/atheros/atheros5212/eeprom.c netdev-atheros/drivers/net/wireless/atheros/atheros5212/eeprom.c
--- netdev-2.6.git#ieee80211/drivers/net/wireless/atheros/atheros5212/eeprom.c 1970-01-01 01:00:00.000000000 +0100
+++ netdev-atheros/drivers/net/wireless/atheros/atheros5212/eeprom.c 2005-08-05 03:48:36.000000000 +0200
@@ -0,0 +1,501 @@
+/*
+ * All the work was created by reverse engineering and porting
+ * for interoperability. The creator is Mateusz Berezecki,
+ * unless explicitly marked ( some parts are derived
+ * from GPL'ed parts of madwifi project located at http://madwifi.sf.net)
+ *
+ * the original assembly code has been created by Sam Leffler
+ * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
+ * All rights reserved.
+ *
+ * rest of the code has been reversed by me and is under copyright too
+ * Copyright (C) 2005 Mateusz Berezecki
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/pci.h>
+#include <linux/netdevice.h>
+
+#include <net/ieee80211.h>
+
+#include <linux/wireless.h>
+#include <net/iw_handler.h>
+
+#include "atheros_id.h"
+#include "atheros_dev.h"
+#include "atheros_defs.h"
+//#include "atheros_devops.h"
+//#include "atheros_regops.h"
+#include "atheros_registers.h"
+#include "atheros.h"
+#include "eeprom.h"
+
+/* XXX add calibration info */
+unsigned int get_cal(struct eeprom_info *e, unsigned int val)
+{
+ return 0;
+}
+
+
+/* should be called poll_read. waits some time for a specific value
+ * being read */
+unsigned int ath_timed_read(struct net_device *netdev,
+ unsigned int reg, unsigned int mask,
+ unsigned int val)
+{
+ unsigned int i, tmp;
+ for (i = 0; i < 1000; i++) {
+ tmp = ath_reg_read(netdev, reg) & mask;
+ if ((tmp & mask) == val)
+ return 1;
+ udelay(15);
+ }
+
+ printk(KERN_DEBUG"atheros: timed read failing: mask:%x val:%x\n",
+ mask, val);
+ return 0;
+}
+
+/* read from EEPROM */
+unsigned int eeprom_read(struct net_device *netdev,
+ unsigned int x, unsigned int *val)
+{
+
+ ath_reg_write(netdev, 0x6000, x);
+ ath_reg_write(netdev, 0x6008, 1);
+
+ if (!ath_timed_read(netdev, 0x600c, 3, 2))
+ return 0;
+
+ *val = ath_reg_read(netdev, 0x6004) & 0xffff;
+
+ return 1;
+}
+
+/* read antenna control stuff while initializing the chipset */
+void eeprom_read_ant_control(struct net_device *netdev, unsigned int reg, unsigned int idx)
+{
+ struct atheros_priv *pdata = ieee80211_priv(netdev);
+ struct eeprom_info *e = &pdata->eeinfo;
+ unsigned int val;
+
+ eeprom_read(netdev, reg++, &val);
+ e->switchval[idx] = (val >> 8) & 0x7f;
+ e->txrx[idx] = (val >> 2) & 0x3f;
+
+ e->antctrl[0][idx] = (val << 4) & 0x3f;
+ e->antctrl[0][idx] |= (val >> 12) & 0x0f;
+ e->antctrl[1][idx] = (val >> 6) & 0x3f;
+ e->antctrl[2][idx] = val & 0x3f;
+
+ eeprom_read(netdev, reg++, &val);
+ e->antctrl[3][idx] = (val >> 10) & 0x3f;
+ e->antctrl[4][idx] = (val >> 4) & 0x3f;
+ e->antctrl[5][idx] = (val << 2) & 0x3f;
+
+ eeprom_read(netdev, reg++, &val);
+ e->antctrl[5][idx] |= (val >> 14) & 3;
+ e->antctrl[6][idx] = (val >> 8) & 0x3f;
+ e->antctrl[7][idx] = (val >> 2) & 0x3f;
+ e->antctrl[8][idx] = (val << 4) & 0x3f;
+
+ eeprom_read(netdev, reg++, &val);
+ e->antctrl[8][idx] |= (val >> 12) & 0xf;
+ e->antctrl[9][idx] = (val >> 6) & 0x3f;
+ e->antctrl[10][idx] = val & 0x3f;
+
+
+}
+
+/* read wireless mode info from EEPROM
+ * XXX: this needs splitting to be more readable.
+ * though i have no idea how to do it yet
+ *
+ * this is UGLY UGLY UGLY
+ */
+void eeprom_read_mode(struct net_device *netdev, unsigned int reg, int k)
+{
+ struct atheros_priv *pdata = ieee80211_priv(netdev);
+ struct eeprom_info *e = &pdata->eeinfo;
+ unsigned int val;
+
+ eeprom_read_ant_control(netdev, reg, k);
+ reg += 4;
+
+ eeprom_read(netdev, reg++, &val);
+ e->adcsize[k] = (val >> 8) & 0xff;
+
+ switch (k) {
+ case 0:
+ e->g5_k4 = (val >> 5) & 7;
+ e->g5_v4 = (val >> 2) & 7;
+ e->g5_k3 = (val << 1) & 7;
+ break;
+
+ case 1:
+ e->g2_k1 = (val >> 4) & 7;
+ e->g2_v1 = val & 7;
+ break;
+
+ case 2:
+ e->g2_k2g = (val >> 4) & 7;
+ e->g2_v2g = val & 7;
+ break;
+ }
+
+ if (k == 0) {
+ eeprom_read(netdev, reg++, &val);
+ e->g5_k3 |= (val >> 15) & 1;
+ e->g5_v3 = (val >> 12) & 7;
+ e->g5_k2 = (val >> 9) & 7;
+ e->g5_v2 = (val >> 6) & 7;
+ e->g5_k1 = (val >> 3) & 7;
+ e->g5_v1 = val & 7;
+ }
+
+ eeprom_read(netdev, reg++, &val);
+ e->txendon[k] = (val >> 8) & 0xff;
+ e->thresh[k] = val & 0xff;
+
+ eeprom_read(netdev, reg++, &val);
+ e->txendoff[k] = (val >> 8) & 0xff;
+ e->txfrmctrl[k] = val & 0xff;
+
+ eeprom_read(netdev, reg++, &val);
+ e->pgasize[k] = (val >> 8) & 0xff;
+ e->noise_floor[k] = val & 0xff;
+
+ if (e->noise_floor[k] & 0x80) {
+ e->noise_floor[k] = 0 -
+ ((e->noise_floor[k] ^ 0xff) + 1);
+ }
+
+ eeprom_read(netdev, reg++, &val);
+ e->xlna_gain[k] = (val >> 5) & 0xff;
+ e->xgain[k] = (val >> 1) & 0x0f;
+ e->xpd[k] = val & 1;
+
+ if (e->version >= 0x4000) {
+ switch (k) {
+ case 0:
+ e->fixed5 = (val >> 13) & 1;
+ break;
+ case 2:
+ e->fixed2 = (val >> 13) & 1;
+ }
+ }
+
+ if (e->version >= 0x3003) {
+ eeprom_read(netdev, reg++, &val);
+ e->detbkoff[k] = (val >> 6) & 0x7f;
+
+ switch (k) {
+ case 0:
+ e->xr5_pwr_limit = val & 0x3f;
+ break;
+ case 1:
+ e->g2_k3[0] = val & 7;
+ e->g2_v3[0] = (val >> 3) & 7;
+ break;
+ case 2:
+ e->g2_k3[1] = val & 7;
+ e->g2_v3[1] = (val >> 3) & 7;
+ break;
+ }
+ }
+
+ if (e->version >= 0x3004) {
+ e->igain[k] = (val >> 13) & 7;
+ eeprom_read(netdev, reg++, &val);
+ e->igain[k] |= (val << 3) & 0x38;
+
+ switch (k) {
+ case 0:
+ if (e->version >= 0x4000) {
+ e->ical[0] =
+ (val >> 8) & 0x3f;
+ e->qcal[0] =
+ (val >> 3) & 0x1f;
+ }
+ break;
+ case 2:
+ e->pwr_diff = (val >> 3) & 0xff;
+ if (e->version >= 0x4006)
+ e->scale_14 =
+ (val >> 11) & 0x1f;
+ break;
+ }
+ } else {
+ e->igain[k] = 10;
+ e->pwr_diff = 10;
+ }
+
+ if (e->version >= 0x4000) {
+ switch (k) {
+ case 0:
+ if (e->version < 0x4001)
+ break;
+ eeprom_read(netdev,reg++, &val);
+ e->rxtx_epsilon[0] = val & 0x3f;
+ break;
+
+ case 1:
+ eeprom_read(netdev,reg++,&val);
+ e->cal11b[0] =
+ get_cal(e, val & 0xff);
+ e->cal11b[1] =
+ get_cal(e, (val >> 8) & 0xff);
+ eeprom_read(netdev,reg++,&val);
+ e->cal11b[2] =
+ get_cal(e, val & 0xff);
+
+ if (e->version < 0x4001)
+ break;
+
+ e->rxtx_epsilon[1] =
+ (val >> 8) & 0x3f;
+ break;
+
+ case 2:
+ eeprom_read(netdev,reg++,&val);
+ e->cal11g[0] =
+ get_cal(e, val & 0xff);
+ e->cal11g[1] =
+ get_cal(e,
+ (val >> 8) & 0xff);
+ eeprom_read(netdev,reg++,&val);
+ e->turbo2_pwr_limit =
+ val & 0x7f;
+ e->xr2_pwr_limit =
+ (val >> 7) & 0x3f;
+ eeprom_read(netdev,reg++,&val);
+ e->cal11g[2] =
+ get_cal(e, val & 0xff);
+
+ if (e->version >= 0x4001) {
+ e->rxtx_epsilon[2] =
+ (val >> 8)&0x3f;
+ }
+ eeprom_read(netdev,reg++,&val);
+ e->ical[1] = (val >> 8) & 0x3f;
+ e->qcal[1] = (val >> 3) & 0x1f;
+
+ if (e->version < 0x4002)
+ break;
+
+ eeprom_read(netdev,reg++,&val);
+ e->pwr_diff = val & 0xff;
+ break;
+ }
+ }
+}
+
+void eeprom_read_info3_3(struct net_device *netdev)
+{
+ struct atheros_priv *pdata = ieee80211_priv(netdev);
+ struct eeprom_info *e = &pdata->eeinfo;
+ unsigned int val, tmp, i;
+
+ eeprom_read(netdev, 0xc2, &val);
+ e->disabled_turbo5 = (val >> 15) & 1;
+ e->disabled_turbo2 = (val >> 3) & 1;
+ e->turbo2_pwr_limit = (val >> 4) & 0x7f;
+
+ e->rfkill = (val >> 14) & 1;
+ e->devtyp = (val >> 11) & 1;
+
+ e->mode_a = (val & 1);
+ e->mode_b = (val >> 1) & 1;
+ e->mode_g = (val >> 2) & 1;
+ printk(KERN_DEBUG"atheros: modes [A:%x B:%x G:%x]\n",
+ e->mode_a, e->mode_b, e->mode_g);
+
+ eeprom_read(netdev, 0xc3, &val);
+ e->antgain_limit[0] = (char) (val >> 8) & 0xff;
+ e->antgain_limit[1] = (char) (val >> 8);
+
+ if (e->version >= 0x4000) {
+ eeprom_read(netdev, 0xc4, &val);
+ e->mp = (val >> 14) & 3;
+ e->ear = (val & 0xfff);
+
+ eeprom_read(netdev, 0xc5, &val);
+ e->pwr_start = val & 0xfff;
+ e->clk_32khz = (val >> 14) & val;
+ }
+
+ eeprom_read_mode(netdev, 0xd4, 0);
+ eeprom_read_mode(netdev, 0xf2, 1);
+ eeprom_read_mode(netdev, 0x10d, 2);
+
+ if (e->version < 0x3003) {
+ eeprom_read(netdev, 0xec, &val);
+ e->g2_k3[0] = val & 7;
+ e->g2_v3[0] = (val >> 3) & 7;
+
+ eeprom_read(netdev, 0xed, &val);
+ e->g2_k3[1] = val & 7;
+ e->g2_v3[1] = (val >> 3) & 7;
+ }
+
+ e->cal.val3 = 4;
+ e->cal.val2 = 1;
+ e->cal.val1 = 1;
+ e->cal.sel = 0;
+
+ tmp = 0x128;
+ for(i = 0; i < e->count; i += 2) {
+ eeprom_read(netdev, tmp++, &val);
+ e->controls[i] = (val >> 8) & 0xff;
+ e->controls[i+1] = val & 0xff;
+ }
+
+ if (e->version <= 0x3002) {
+ e->noise_floor[0] = -54;
+ e->noise_floor[1] = -1;
+ e->noise_floor[2] = -1;
+
+ e->thresh[0] = 15;
+ e->thresh[1] = 28;
+ e->thresh[2] = 28;
+ }
+
+ return;
+}
+
+unsigned int eeprom_read_info(struct net_device *netdev)
+{
+ struct atheros_priv *pdata = ieee80211_priv(netdev);
+ struct eeprom_info *e = &pdata->eeinfo;
+
+ e->pwr_diff = 15;
+ e->scale_14 = 15;
+
+ printk(KERN_DEBUG"atheros: eeprom version %x\n",
+ e->version);
+ if (e->version >= 0x3003) {
+ printk(KERN_DEBUG"atheros: >= 3.3\n");
+ eeprom_read_info3_3(netdev);
+ return 1;
+ } else {
+ /* to be added yet XXX
+ eeprom_read_info3(netdev);
+ */
+ return 0;
+ }
+
+ return 1;
+}
+
+
+/* validates EEPROM checksum */
+unsigned int eeprom_chksum(struct net_device *netdev)
+{
+ unsigned int sum = 0, i, val;
+
+ for (i = 0; i < 832; i++) {
+ if (!eeprom_read(netdev, 0xc0 + i, &val))
+ return 0;
+ sum ^= val;
+ }
+
+ if (sum != 0xffff)
+ return 0;
+
+ return 1;
+}
+
+/* initialize EEPROM and prepare the chipset */
+unsigned int eeprom_init(struct net_device *netdev)
+{
+ unsigned int size;
+ unsigned int v;
+ struct atheros_priv *pdata = ieee80211_priv(netdev);
+
+ if (!eeprom_read(netdev, 0xc1, &v)) {
+ printk(KERN_ERR"atheros: eeprom version read failed!\n");
+ return 0;
+ }
+ pdata->eeinfo.version = v;
+
+ printk(KERN_DEBUG"atheros: eeprom_init eeprom version %x\n",
+ pdata->eeinfo.version);
+ if (pdata->eeinfo.version < 0x3002) {
+ printk(KERN_ERR"atheros: unsupported eeprom version\n");
+ return 0;
+ }
+
+ size = ath_reg_read(netdev, 0x4010);
+ size = (size & 0x18) >> 3;
+
+ if (size != 2) {
+ printk(KERN_ERR"atheros: invalid eeprom size!\n");
+ return 0;
+ }
+ if (eeprom_read(netdev, 0x3f, &v) == 0) {
+ printk(KERN_ERR"atheros: cant read eeprom 3f bit\n");
+ return 0;
+ }
+ pdata->eeinfo.rdonly = v;
+ printk(KERN_DEBUG"atheros: eeprom rdonly flag : %x\n", v);
+ if (!eeprom_chksum(netdev)) {
+ printk(KERN_ERR"atheros: bad eeprom checksum!\n");
+ return 0;
+ }
+
+
+ return 1;
+}
+
+/* read chipset capabilities */
+unsigned int eeprom_read_caps(struct net_device *netdev)
+{
+ if (!eeprom_read_info(netdev))
+ return 0;
+
+ /* TODO: read calibration info here */
+ return 1;
+}
+
+/* just as the name says. reads hardware MAC address directly from
+ * EEPROM */
+unsigned int eeprom_read_mac(struct net_device *netdev, unsigned char *mac)
+{
+ unsigned int total = 0, i, val;
+
+ if (mac == NULL)
+ return 0;
+
+ for (i = 0; i < 3; i++) {
+ if (!eeprom_read(netdev, 0x1f - i, &val))
+ return 0;
+ total += val;
+ mac[2*i] = val >> 8;
+ mac[2*i + 1] = val & 0xff;
+ }
+
+ if (total == 0 || total == 3*0xffff)
+ return 0;
+
+ return 1;
+}
+
diff -uprN -X 'netdev-2.6.git#ieee80211/Documentation/dontdiff' netdev-2.6.git#ieee80211/drivers/net/wireless/atheros/atheros5212/eeprom.h netdev-atheros/drivers/net/wireless/atheros/atheros5212/eeprom.h
--- netdev-2.6.git#ieee80211/drivers/net/wireless/atheros/atheros5212/eeprom.h 1970-01-01 01:00:00.000000000 +0100
+++ netdev-atheros/drivers/net/wireless/atheros/atheros5212/eeprom.h 2005-08-05 03:48:36.000000000 +0200
@@ -0,0 +1,209 @@
+/*
+ * All the work was created by reverse engineering and porting
+ * for interoperability. The creator is Mateusz Berezecki,
+ * unless explicitly marked ( some parts are derived
+ * from GPL'ed parts of madwifi project located at http://madwifi.sf.net)
+ *
+ * derived or copied parts of code licensed under
+ * dual GPL/BSD license
+ * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
+ * All rights reserved.
+ *
+ * rest of the code has been reversed by me and is under copyright too
+ * Copyright (C) 2005 Mateusz Berezecki
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef _EEPROM_H
+#define _EEPROM_H
+
+struct cal_info {
+ unsigned short sel;
+ unsigned short val1;
+ unsigned short val2;
+ unsigned short val3;
+};
+
+struct chan_data {
+ unsigned short chan_val;
+ unsigned short lower_limit;
+ unsigned short upper_limit;
+ unsigned short count;
+ unsigned short clk_values[11];
+ short pwr_values[11];
+};
+
+struct power_info {
+ unsigned short pwr1;
+ unsigned short pwr2;
+ unsigned short pwr3;
+ unsigned short pwr4;
+ unsigned short pwr5;
+};
+
+struct power_modes {
+ unsigned short num11a;
+ unsigned short num11b;
+ unsigned short num11g;
+
+ struct power_info pwr11a[8];
+ struct power_info pwr11b[2];
+ struct power_info pwr11g[3];
+};
+
+struct eestrct {
+ unsigned short val1;
+ unsigned short val2;
+ unsigned char flg;
+};
+
+struct chip_data {
+ unsigned short val1;
+ unsigned short val2;
+ unsigned short vals[4];
+ short vals2[4];
+};
+
+struct chip_chan_data {
+ unsigned short chanval;
+ short pwr_upper_limit;
+ struct chip_data cdata[4];
+};
+
+struct chip_chan_pwr_data {
+ unsigned short *pchans;
+ unsigned short chcount;
+ unsigned short val;
+ struct chip_chan_data *pchandata;
+};
+
+struct eeprom_info {
+ unsigned short version;
+ unsigned short rdonly;
+ unsigned short regdomain;
+ unsigned short devtyp;
+
+ unsigned short mode_a;
+ unsigned short mode_b;
+ unsigned short mode_g;
+
+ unsigned short turbo5_pwr_limit;
+ unsigned short turbo2_pwr_limit;
+
+ unsigned short ext5g;
+ unsigned short xr5_pwr_limit;
+ unsigned short xr2_pwr_limit;
+
+ unsigned short disabled_turbo5;
+ unsigned short disabled_turbo2;
+ unsigned short rfkill;
+
+ unsigned char antgain_limit[2];
+
+ unsigned char pwr_diff; /* cck ofdm delta */
+ unsigned short pwr_gain;
+
+ unsigned char clk_32khz;
+
+ unsigned short pwr_start;
+ unsigned short fixed5;
+ unsigned short fixed2;
+ unsigned short scale_14;
+ unsigned short mp;
+ unsigned short ear;
+
+
+ unsigned short switchval[3];
+ unsigned short txrx[3];
+ unsigned short txendon[3];
+ unsigned short thresh[3];
+ unsigned short txendoff[3];
+ unsigned short txfrmctrl[3];
+ char adcsize[3];
+ char pgasize[3];
+ unsigned short noise_floor[3];
+
+ unsigned short xlna_gain[3];
+ unsigned short xgain[3];
+ unsigned short xpd[3];
+ unsigned short antctrl[11][3];
+ unsigned short detbkoff[3];
+ unsigned short igain[3];
+ unsigned short rxtx_epsilon[3]; /* error margin */
+
+
+ unsigned short g5_k1;
+ unsigned short g5_v1;
+ unsigned short g5_k2;
+ unsigned short g5_v2;
+ unsigned short g5_k3;
+ unsigned short g5_v3;
+ unsigned short g5_k4;
+ unsigned short g5_v4;
+
+ unsigned short g2_k1;
+ unsigned short g2_v1;
+ unsigned short g2_k2g;
+ unsigned short g2_v2g;
+ unsigned short g2_k3[2];
+ unsigned short g2_v3[2];
+
+ unsigned short count;
+ unsigned short controls[32];
+
+ unsigned short ical[2];
+ unsigned short qcal[2];
+
+ unsigned short cal11g[3];
+ unsigned short cal11b[3];
+
+
+ struct cal_info cal;
+
+ unsigned short num_ch5;
+ unsigned short ch_11a[10];
+ struct chan_data chans_11a[10];
+
+ unsigned short num_ch2;
+ unsigned short ch_11g[3];
+ unsigned short ch_11b[3];
+ struct chan_data chans_11g[3];
+ struct chan_data chans_11b[3];
+
+ struct power_modes pmodes;
+
+ struct eestrct rsomething[128];
+ struct chip_chan_pwr_data pvals[3];
+};
+
+unsigned int ath_eeprom_read(struct net_device *,
+ unsigned int x, unsigned int *);
+
+unsigned int ath_timed_read(struct net_device *,
+ unsigned int, unsigned int, unsigned int);
+
+unsigned int eeprom_read(struct net_device *,
+ unsigned int, unsigned int *);
+
+unsigned int eeprom_init(struct net_device *);
+
+unsigned int eeprom_read_mac(struct net_device *, unsigned char *);
+
+unsigned int eeprom_read_caps(struct net_device *);
+
+
+#endif
+
[-- Attachment #3: Type: text/plain, Size: 154 bytes --]
_______________________________________________
Kernel-mentors mailing list
Kernel-mentors@selenic.com
http://selenic.com/mailman/listinfo/kernel-mentors
reply other threads:[~2005-08-05 14:23 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050805142359.GA2576@ntjohd.mshome.net \
--to=mateuszb@gmail.com \
--cc=kernel-mentors@selenic.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox