# [Ethernet/Wi-Fi]Installer les drivers r1000/ipw3945(en cours

## babos

Bon,voilà, je viens de recevoir mon tout nouveau portable: un Asus V6J.

Super, je me mets tout de suite au boulot pour instaler Gentoo en vue de virer plus tard cet affreux windaub pro

Le live-cd démarre, gnome se lance, tout va bien.

Mais voilà, aïe, impossible d'accéder à internet.

En cherchant un peu, j'identifie le modem wifi, il me faut les pilotes 3945abg. Super, ils sont en stable dans l'arbre de portage.

Ah beh oui, mais je suis n00b, je ne sais pas comment les inclure dans le liveCD   :Sad: 

Est-ce que quelqu'un aurait une idée pour pouvoir obtenir ces pilotes et commencer une instal avec internet?

Le genkernel me rebute car je ne peux maîtriser ses paramètres, j'ai essayé déjà de compiler les pilotes à partir de http://ipw3945.sourceforge.net/,

mais le make refuse de passer car il n'identifie pas le module 802111, même en le chargeant avec modprobe.

Je me demande d'ailleurs s'il est possible de compiler des pilotes à partir d'un liveCD, étant donné que le noyau est écrit sur un support non inscriptible.

Si quelqu'un avait une petite idée pour m'aider, je le remercie d'avance.

----------

## GaMeS

bonsoir,

Au risque de passé pour un trolleur, lance ton pc avec une Ubuntu live il intègre pas mal de drivers wifi.

Ensuite à toi de te lancé pour installé Gentoo !  :Smile: 

----------

## Delvin

+1 ca évite de lire la doc et tu peux faire des copier-coller directement  :Smile: 

----------

## man in the hill

Salut, 

Tu n'a pas un cable Ethernet en attendant ?

Colle nous un 

```
lspci
```

 .

As-tu vérifié si gentoo reconnaît ta carte Ethernet , colle aussi cette commande 

```
ifconfig -a
```

  .

                                                                        @+

----------

## Pixys

 *Delvin wrote:*   

> +1 ca évite de lire la doc et tu peux faire des copier-coller directement 

 

C'est pas très malin ça..... lire la doc c'est la base.

Pour répondre au problème, tu peux essayer différent live-cd comme par exemple le rescue cd http://www.sysresccd.org/Main_Page tu peux le personnaliser il me semble.

----------

## Delvin

pardon, je voulais dire imprimer, bien sur qu'il faut la lire !

----------

## GaMeS

 *Pixys wrote:*   

> 
> 
> Pour répondre au problème, tu peux essayer différent live-cd comme par exemple le rescue cd http://www.sysresccd.org/Main_Page tu peux le personnaliser il me semble.

 

+1  *SystemRescueCd wrote:*   

> It is possible to make customized versions of the disc. For example, it means you can add your own scripts, that helps to make an automatic restauration of the system. It's also possible to burn a customized DVD, with SystemRescueCd and 4.2 GB for your data (backup for example). Read the manual for more details.

 

Pour ma part, je ne connaissais pas, j'vais de ce pas le testé.

----------

## Pixys

Ce live-cd est très chouette: il y a le support pour reiser4, ya plus qu'à utiliser un noyau adéquate ou patcher les gentoo-sources..... Petite observation: ce live-cd ne connait pas la commande "mirrorselect" pour selectionner les mirroirs.

----------

## babos

ok, merci pour les indications, un petit clin d'oeil spécial pour Man in the Hill.

Bon, voici les sorties des commandes lspci, ifconfig -a:

```
livecd ~ # lspci

00:00.0 Host bridge: Intel Corporation Mobile 945GM/PM/GMS/940GML and 945GT Express Memory Controller Hub (rev 03)

00:01.0 PCI bridge: Intel Corporation Mobile 945GM/PM/GMS/940GML and 945GT Express PCI Express Root Port (rev 03)

00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 02)

00:1c.0 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 1 (rev 02)

00:1c.1 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 2 (rev 02)

00:1c.2 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 3 (rev 02)

00:1c.3 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 4 (rev 02)

00:1d.0 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI #1 (rev 02)

00:1d.1 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI #2 (rev 02)

00:1d.2 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI #3 (rev 02)

00:1d.3 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI #4 (rev 02)

00:1d.7 USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI Controller (rev 02)

00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev e2)

00:1f.0 ISA bridge: Intel Corporation 82801GBM (ICH7-M) LPC Interface Bridge (rev 02)

00:1f.1 IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller (rev 02)

01:00.0 VGA compatible controller: nVidia Corporation Unknown device 01d8 (rev a1)

02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. Unknown device 8168 (rev 01)

03:00.0 Network controller: Intel Corporation Unknown device 4222 (rev 02)

07:01.0 FireWire (IEEE 1394): Ricoh Co Ltd Unknown device 0832

07:01.1 Class 0805: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (rev 19)

07:01.2 System peripheral: Ricoh Co Ltd Unknown device 0843 (rev 01)

07:01.3 System peripheral: Ricoh Co Ltd R5C592 Memory Stick Bus Host Adapter (rev 0a)

07:01.4 System peripheral: Ricoh Co Ltd xD-Picture Card Controller (rev 05)

livecd ~ # ifconfig -a

eth0      Link encap:UNSPEC  HWaddr 00-E0-18-00-03-54-2C-62-00-00-00-00-00-00-00-00

          BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:16436  Metric:1

          RX packets:126 errors:0 dropped:0 overruns:0 frame:0

          TX packets:126 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:7934 (7.7 Kb)  TX bytes:7934 (7.7 Kb)

sit0      Link encap:IPv6-in-IPv4

          NOARP  MTU:1480  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
```

Sinon, en attendant éventuellement vos aides, après avoir essayé le live CD de Gentoo et la knoppix, je vais essayer de modifier mon liveCD de knoppix (version 5.0.1)

Merci à tous

Une dernière précision, j'ai bien également un cable eternet branché en direct sur le portable, mais je n'obtiens rien non plus avec celui ci. Sous windaub, tout fonctionne, maudit soit tu Bill Gates

----------

## man in the hill

Salut ,

Apparement ta carte Ethernet est reconnu mais il faut configurer ta connexion :

```
/etc/init.d/net.eth0 start
```

 , regarde si tu n'as pas le driver r8189 de monté avec lsmod. 

Pour  ton wifi, as-tu suivi ce mini-guide 

http://ipw3945.sourceforge.net/INSTALL

                                                                    @+

----------

## babos

ok, bon en premier l'eternet:

```
livecd ~ # /etc/init.d/net.eth0 start  * Starting eth0

 *   Bringing up eth0

 *     dhcp

 *       Running dhcpcd ...                                               [ !! ]
```

hum, je lance alors le lsmod et comme on peut s'en douter:

```
livecd ~ # lsmod

Module                  Size  Used by

ipv6                  187744  8

hci_usb                10804  0

bluetooth              30948  1 hci_usb

pcspkr                  1156  0

rtc                     8948  0

eth1394                14536  0

dm_mirror              14672  0

dm_mod                 37048  1 dm_mirror

pdc_adma                6212  0

sata_mv                12516  0

ata_piix                6532  0

ahci                    9124  0

sata_qstor              6468  0

sata_vsc                5316  0

sata_uli                4644  0

sata_sis                5220  0

sata_sx4               10052  0

sata_nv                 5924  0

sata_via                5668  0

sata_svw                4932  0

sata_sil24              7684  0

sata_sil                6244  0

sata_promise            7716  0

libata                 35912  15 pdc_adma,sata_mv,ata_piix,ahci,sata_qstor,sata_vsc,sata_uli,sata_sis,sata_sx4,sata_nv,sata_via,sata_svw,sata_sil24,sata_sil,sata_promise

sbp2                   16484  0

ohci1394               25140  0

ieee1394               57272  3 eth1394,sbp2,ohci1394

sl811_hcd               9344  0

ohci_hcd               14916  0

uhci_hcd               24144  0

usb_storage            49920  0

usbhid                 28992  0

ehci_hcd               22856  0

usbcore                80068  8 hci_usb,sl811_hcd,ohci_hcd,uhci_hcd,usb_storage,usbhid,ehci_hcd
```

Aucun module r8189 n'est présent

Lorsque je dresse la liste des modules disponibles avec la commande:

find /lib/modules/2.6.15-gentoo-r5/ -type f -iname '*.o' -or -iname '*.ko'

, impossible de trouver le module r8189 :\

```
# modprobe r8189

FATAL: Module r8189 not found.
```

Du côté de la wireless, j'avais déjà essayé avec un petit howto semblable, mais le tien est plus complet, merci.

Je donne les sorties au cas où quelqu'un aurait une idée:

```
livecd ieee80211-1.1.14 # make

Checking in /lib/modules/2.6.15-gentoo-r5 for ieee80211 components...

find: /lib/modules/2.6.15-gentoo-r5/build: No such file or directory

find: /lib/modules/2.6.15-gentoo-r5/source: No such file or directory

find: /lib/modules/2.6.15-gentoo-r5/build/: No such file or directory

/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211.ko

/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211_crypt.ko

/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211_crypt_ccmp.ko

/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211_crypt_tkip.ko

/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211_crypt_wep.ko

Above files found.  Remove? [y],n y

find: /lib/modules/2.6.15-gentoo-r5/build: No such file or directory

find: /lib/modules/2.6.15-gentoo-r5/source: No such file or directory

find: /lib/modules/2.6.15-gentoo-r5/build/: No such file or directory

rm: cannot remove `/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211.ko': Read-only file system

rm: cannot remove `/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211_crypt.ko': Read-only file system

rm: cannot remove `/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211_crypt_ccmp.ko': Read-only file system

rm: cannot remove `/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211_crypt_tkip.ko': Read-only file system

rm: cannot remove `/lib/modules/2.6.15-gentoo-r5/kernel/net/ieee80211/ieee80211_crypt_wep.ko': Read-only file system

Old ieee80211 references found.  In order to build the ieee80211

subsystem, prior versions must first be removed.  You can perform

this task by running this makefile as root via:

    % sudo make check_old

and answering Y to remove the file references.

Aborting make.

make: *** [check_old] Error 1
```

J'essaie différentes commandes pour les retirer mais c'est impossible car ils sont écrits sur le CD.

Donc, je charge l'ancien module avec modprobe ieee80211

Tout fonctionne, lsmod détecte deux modules chargés :

ieee80211              22792  0

ieee80211_crypt         2656  1 ieee80211

Donc j'essaie le make pour ipw3945:

```
livecd ipw3945-1.1.0-pre2 # make

sed: can't read /lib/modules/2.6.15-gentoo-r5net/ieee80211.h: No such file or directory

 ERROR: A compatible subsystem was not found in the following path[s]:

       /lib/modules/2.6.15-gentoo-r5 /lib/modules/2.6.15-gentoo-r5/build

 You need to install the ieee80211 subsystem from http://ieee80211.sf.net

 and point this build to the location where you installed those sources, eg.:

        % make IEEE80211_INC=/usr/src/ieee80211/

 or use the 'make patch_kernel' within the ieee80211 subsystem to patch your

 kernel sources.

make: *** [check_inc] Error 1
```

Mince alors, me voilà à nouveau bloqué, :\

Merci pour l'aide encore une fois et s'il y a d'autres idées,  :Smile: , je les accueille avec anthousiasme. Désolé encore pour ce post un peu long.

----------

## man in the hill

Salut ,

 :Embarassed:   , c'est le module r8169 , désolé !!!!

                                                                    @+

----------

## man in the hill

 *babos wrote:*   

> Donc j'essaie le make pour ipw3945:
> 
> livecd ipw3945-1.1.0-pre2 # make
> 
> sed: can't read /lib/modules/2.6.15-gentoo-r5net/ieee80211.h: No such file or directory
> ...

 

Est-ce que tu as ce fichier sur ton system:  

```
updatedb 
```

ensuite

```
locate ieee80211.h
```

 *babos wrote:*   

> Merci pour l'aide encore une fois et s'il y a d'autres idées, , je les accueille avec anthousiasme. Désolé encore pour ce post un peu long.

 

Les posts avec beaucoup de détails sont plus à même de trouver une solution...

                                                                                                     @ +

----------

## babos

Il n'y a pas de soucis,

bon, même avec le module r8169, rien ne change.

J'ai trouvé également un lien http://www.realtek.com.tw/downloads/downloads1-3.aspx?keyword=8168, 

qu'un utillisateur du même portable a conseillé sur son wiki, il aurait réussi assez facilement à identifier son eternet,

Mais comme pour le pilote de la wireless, après essais,

impossible de compiler car le noyau est compilé en dur sur le CD. Lui, il avait déjà instalé son système apparemment.

Dans un de mes livres, j'ai trouvé un petit hack pour remasteuriser la knoppix.

Donc je vais essayer en attendant d'autres suggestions.

Merci en tous cas pour l'aide.

----------

## babos

L'outil de recherche de gnome trouve updatedb.conf dans /etc du CD

Si je tape updatedb dans la console, rien ne se passe.

Idem pour locate ieee80211.h

L'outil de recherche de gnome ne trouve aucun fichier ieee80211.h

Voilà pour ce soir, merci de ton aide  :Smile: 

----------

## geekounet

 *babos wrote:*   

> ok, bon en premier l'eternet:
> 
> ```
> livecd ~ # /etc/init.d/net.eth0 start  * Starting eth0
> 
> ...

 

Ben apparemment, ta carte est bien detéctée puisqu'il essaie de la configurer. Tu as bien emergé dhcpcd ?

----------

## GNUtoo

 *Pixys wrote:*   

>  *Delvin wrote:*   +1 ca évite de lire la doc et tu peux faire des copier-coller directement  
> 
> C'est pas très malin ça..... lire la doc c'est la base.
> 
> Pour répondre au problème, tu peux essayer différent live-cd comme par exemple le rescue cd http://www.sysresccd.org/Main_Page tu peux le personnaliser il me semble.

 

espece de RTFM(read the fucking manual) http://bcm43xx.berlios.de/?go=Support

lol

ubuntu c'est linux for human beeing...

ca veut dire que y'as des personnes qui veulent juste se servir de l'ordi et ne pas avoir a lire des tones de manuels

d'un autre cote c'est parfois bien plus simple de lire le manuel

----------

## man in the hill

 *pierreg wrote:*   

>  *babos wrote:*   ok, bon en premier l'eternet:
> 
> ```
> livecd ~ # /etc/init.d/net.eth0 start  * Starting eth0
> 
> ...

 

ça, j'en suis persuader que ça carte est détecté car il ne pourrait pas la voir avec ifconfig sans cela !!!!!!mais ou est le module , pas vu de le lsmod  en tout cas!  Un live-cd sans client dhcp...un petit :

```
whereis dhcpcd
```

. Sinon essais de donner un adresse fixe...

Sinon, qu'est-ce qu'il y'a  sur ce live-cd, y'a pas portage des fois   :Laughing:  ? Regarde ds /usr/portage .

                                                                           @+

----------

## GNUtoo

 *babos wrote:*   

> Bon,voilà, je viens de recevoir mon tout nouveau portable: un Asus V6J.
> 
> Super, je me mets tout de suite au boulot pour instaler Gentoo en vue de virer plus tard cet affreux windaub pro
> 
> Le live-cd démarre, gnome se lance, tout va bien.
> ...

 

gentoo n'est pas conseille pour les debutants a moin d'avoir un livecd comme knoppix a cote

simplement pour connaitre le nom des programes pour des taches precises

par exemple si tu cherche un programme pour graver des cd, il faut connaitre le nom du programme,k3b est un des multiples programes possibles

----------

## babos

Merci new_to_non, j'ai bien sûr un liveCD KNOPPIX et je connaissais déjà k3b  :Smile: 

Le problème est différent ici car il s'agissait d'essayer de remasteuriser le liveCD, sinon j'ai déjà réalisé une install gentoo sur un

de mes PC en dual boot avec 3 disque dur, xorg 7 et l'aacélération 3D sur une nvidia, donc je connais quand même un peu la distrib.

Enfin bon, de toutes façon je ne pense pas que l'on doive déconseiller d'utiliser la Gentoo si l'on est prêt à y consacrer du temps.

Pierreg, comment je peux emerger sans réseau?

Je crois que je vais plutôt essayer de mettre directement les sources dans les distfiles et après avoir décompressé portage comme me l'a signalé Man in

the Hill, d'émerger ces sources.

----------

## geekounet

Pardon, je devais être mal réveillé quand j'ai écris ça  :Confused:  dhcpcd est déjà sur le livecd normalement. Pas besoin de l'emerger.

Bah sinon je sais pas. Tu reçois bien ta conf réseau par dhcp normalement, ou faut la configurer à la main ?

----------

## babos

Il n'y a pas de problème Pierreg, c'est toujours agréable de recevoir de l'aide.

Comme tu le dis, j'ai repéré  les commandes dhcpcd eth0 dans l'ancien manuel de gentoo 2005.0

je vais essayer tout de suite  :Wink: 

----------

## man in the hill

Salut,

Je n'ai jamais utilisé le live-cd et j'aimerais bien savoir,  si tu as emerge et l'arborescence de portage car ds ce cas tu peux tester une installe classique en installant juste les répertoires et ebuilds + patch , si ils n'y sont pas, et l'archive ds distfiles . (cela ne garantie rien mais tu peux tjrs essayer).

                                                                                   @+

----------

## babos

OUi, il y a bien un snapshot, par précaution, j'ai téléchargé le plus récent pour l'install. Je télécharge également actuellement le stage3 car il n'est pas sur le liveCD. Après l'install, je vais essayer de placer les tar dans le distfiles.

----------

## babos

Là, je suis perdu j'avoue.

J'ai réussi à installer portage et le stage3 mais impossible d'obtenir les gentoo-sources sans internet.

 :Sad:  j'ai lu d'autre forum en Anglais et tout le monde parait bloqué pour l'install à partir d'un CD.

Je n'arrive pas à trouver gentoo-sources-2.6.16-r9 que me réclame portage. Je ne trouve que des genpatch, mince alors.

----------

## man in the hill

Salut,

Tu récupère le kernel vanilla : http://www.kernel.org

                                                                                @ +

----------

## babos

Super, merci Man in the Hill, j'ai donc télécharger le noyau 2.6.16

hum, mince alors, pendant l'install, alors que je suis rentré dans mon nouvelle environnement et que j'ai placé les fichiers tar dans distfiles, j'obtiens cette erreur:

```
livecd / # emerge gentoo-sources

Calculating dependencies ...done!

>>> emerge (1 of 1) sys-kernel/gentoo-sources-2.6.16-r9 to /

!!! File system problem. (Bad Symlink?)

!!! Fetching may fail: [Errno 20] Not a directory: '/usr/portage/distfiles/cvs-src'

!!! No write access to /usr/portage/distfiles/

!!! File genpatches-2.6.16-11.base.tar.bz2 isn't fetched but unable to get it.

livecd / # mkdir /usr/portage/distfiles/cvs-src

mkdir: cannot create directory `/usr/portage/distfiles/cvs-src': Not a directory
```

Qu'estce que c'est exactement ce cvs-src? Sur mon autre install de Gentoo, je ne trouve rien qui y corresponde dans les distfiles. Est-ce que cela n'est créé que durant l'émerge et ensuite enlevé?

Peut-être qu'il vaudrait mieux que je fasse d'abord une install sans reseau avec le genkernel, que je compile ensuite les gentoo-sources en changeant le lien et en modifiant grub, puis en virant le genkernel? Si quelqu'un peut m'éclairer de sa lumière, merci.

Ah, au fait, StuTheBearded a écrit dans le sujet : https://forums.gentoo.org/viewtopic-t-436599-highlight-8168.html:

the 8169 can't possibly work with the 8168 chip for the simple reason their on different buses, the 8169 is a PCI chip the 8168 is a PCI-E chip now please correct me if i'm wrong but i was aware these are very different. Shame theres no kernel module :S looks like the realtek driver it is.

----------

## man in the hill

Salut ,

En fait, si je suis bien, tu as quasiment fait ton install sans internet et il ne te manque plus qu'a compiler le noyau  et configurer grub,  tu peux ensuite au reboot  installer ton wireless en recupérant les paquets necéssaires .Sers toi de ton autre gentoo pour recupérer ce dont tu as besoins (même un bureau comme xfce4 en attendant, si tu veux absolument un bureau pour bosser...). As tu configuré ssh pour communiqué entre ton portable et ta tour , c'est le plus simple pour transférer des fichiers...d'ailleurs c'est ce que t'aurais du faire des la début, désolé , je n'ai pas pensé à ça , malgré mon utilisation quotidienne de ssh   :Embarassed:  .Si tu as un réseau avec un routeur , tape :

```
ssh numéro_d'IP_de_ta_tour
```

Si tu veux récupérer un fichier qui se trouve sur ta tour distante :

```
scp  IP_de_ta_tour:/le_chemin/du_fichier       /ou_tu_veux/sur_ton_portable
```

As-tu essayé de configurer ta carte Ethernet en fixe ? As-tu un routeur ?

Regarde le handbook, tu t'y retrouveras tout de suite  http://www.gentoo.org/doc/fr/handbook/

Par contre si tu essais de changer le noyau du livecd, je crois que c'est chaud !

Bon courage , sans le net ce n'est pas évident...

[EDIT] C'est une carte Ethernet et non graphique   :Razz:   mais ta carte est détecté , il faut juste la configurer , tu peux faire le test sur ta tour enlève le driver et tu ne verras plus ta carte avec ifconfig -a [/EDIT]

                                                                                                @+

----------

## babos

Oui, c'est exactement cela, j'ai placé sur une clé usb l'image du dernier snapshots et du stage3 correspondant à mon architecture.

Puis j'ai fait l'install en suivant pas à pas le guide en ligne de commande, en montant la clé et en récupérant les fichiers nécessaires. Merci pour l'aide sur le ssh d'ailleurs, ca va sûrement me simplifier l'install.

Donc j'arrive à l'étape du chroot pour rentrer dans mon nouvel environnement, tout se passe correctement.

Puis, je ne peux pas faire emerge--sync, mais comme j'ai installé le dernier snapshots dans le dossier /user, normalement

je devrais avoir le dernier arbre de portage.

En vérifiant, tout est là apparemment, sauf le répertoire distfiles que je créé à la main.

J'y place dedans les tar :

linux-2.6.16.tar.bz2

genpatches-2.6.16-11.extras.tar.bz2

genpatches-2.6.16-11.base.tar.bz2

Alors je lance la commande

emerge gentoo-sources, mais là, ca bloque comme je l'ai dit précédemment à cause de ce cvs-src.

Je ne suis pas attaché à un bureau pour bosser car j'en ai un déjà sur un autre ordi et pour l'install, je préfère tout faire en ligne de commande pour bien contrôler les étapes, mais merci  :Smile: 

Le handbook, je l'ai lu et relu de nombreuses fois car j'ai imprimé celui de la 2005.0 qui lui ressemble beaucoup, mais je vais continuer à chercher dedans, je n'arrête jamais de le consulter celui-là.

Donc si j'ai bien compris, tournant sous le noyau du live-CD, malgré le changement d'environnement, il est impossible de compiler un autre noyau que le genkernel sans passer par le téléchargement de portage? Ou aurait-je planté une étape entre le stage3 qui ne se serait pas adapté à mon snapshots. Qu'est-ce que c'est que ce cvs-src?

Sinon, pour clarifier la situation : j'ai une tour qui tourne sous gentoo branchée à mon routeur WIFI/LAN, un Olitec. Elle fonctionne presque parfaitement.

En tout cas le réseau est niquel.

En ce moment, j'essaie d'installer la Gentoo sur mon portable, un V6J, qui peut avoir accès à internet par le routeur mais sous cet affreux Windaub. Alors avec ma petite clé usb, j'arrêtais pas de faire des allez retour en les deux PC. Merci pour ssh, je vais tester.

Sinon, je n'est pas compris ton édite. Si tu regarde le lien que j'ai mis, le pilote r1000 est à utiliser pour le modem 8168, à moins que je n'ai rien compris du sujet de ce topic.

Bon, je crois que je vais finir par installer le genkernel, faire une installe sans réseau classique en fait, puis booter sur ce nouveau système et injecter les pilotes des deux modems. Puis j'émergerait gentoo-sources qui cette fois ci devrait se télécharger normalement, créerai mon noyau personnalisé et modifierai les liens qui pointe et le grub.conf. Enfin, si ça redémarre  :Smile: , j'essaierai de virer alors ce genkernel.

Merci de ton aide, j'attends un peu avant de faire cela, histoire d'avoir ton avis sur ce post et peut-être d'éviter de faire une grosse install inutile  :Wink: 

----------

## man in the hill

SAlut ,

je vois mieux maintenant la situation, donc si tu as suivi ces étapes  http://www.gentoo.org/doc/fr/handbook/handbook-x86.xml?part=1&chap=5ton  ton arbre portage devrais se trouver ds 

```
/usr
```

 donc avec les répertoires 

```
/usr/portage/
```

 ds lequel se trouve tous les répertoires référençant les ebuilds  et le répertoire distfiles donc tu n'as peut-être pas installé au bonne endroit... Ensuite le repertoire cvs-src est un répertoire particulié ou sont téléchargé de paquets qui ne sont pas ds l'arbre portage qui se trouve généralement ds un overlay, (tu comprendras ensuite cette histoire d'overlay !!!)  mais tu n'as pas besoin d'installer les sources par portage , il suffit de les décomprésser ds le répertoire /usr/src/:

```
cd   /usr/src/

tar -xjvf  /chemin/du_tarball_des_sources 
```

 ensuite tu fais  un lien symbolique pointant vers le répertoire des sources que tu as détarrées

```
ln -s   le_répertoire_des_sources     linux
```

ensuite :

```
cd linux

make menuconfig
```

et tu peux compiler !

Hors sujet mon édit   :Wink:  , bon apparement il faut que tu appliques un patch au noyau pour pouvoir utiliser le driver r8169 , donc bravo tu te débrouille très bien et y en a qui dise que les nouveaux ne sont pas motivé et qu'il ne faut pas ouvrir gentoo à tous , ça ma fait bien marrer   :Laughing:  . je déborde là !

                                                                                            @+

[EDIT]ssh sans la carte Ethernet configuré ce n'est pas possible, la clé usb est de mise mais en tout cas ça pourra tjrs te servir par la suite ! donne à ta carte une adresse fixe pour voir si elle la récupère : http://www.gentoo.org/doc/fr/handbook/handbook-x86.xml?part=1&chap=3  , tu scrolles tout en bas pour voir la config à la main   ifconfig -a pour voir le résultat[/EDIT] vraiment la tête ailleurs...

----------

## babos

super, je vais essayer tout de suite, j'ai lu aussi le guide de mise à jour des noyaux, je pense que ca pourra m'aider.

http://www.gentoo.org/doc/fr/kernel-upgrade.xml

Bon, aller, maintenant je teste tout ca, la suite au prochain post. Merci beaucoup, notamment pour le clin d'oeil à tous les débutants!  :Smile: 

Ah oui, au fait, j'ai créé le répertoire distfiles exactement ici: /usr/portage/distfiles

[EDIT] En fait il s'agissait d'une grossière erreur de permissions, j'avais du créé le répertoire distfiles alors que j'étais encore dans l'environnement

du liveCD. Je l'ai donc supprimé et refabriqué dans mon nouvel environnement d'install. La suite après l'install complète et le boot réussi...[/EDIT]

----------

## boozo

'alute

Attendu que tu es déjà bien avancé pour réglé ton pb, c'est juste au cas où tu n'aurais pas vu ces topics sur le forum : voici deux liens (même s'il y en a un dont je n'ai pas eu le retour  :Sad:  ) qui je l'espère te seront utile pour ton r1000   :Wink: 

----------

## man in the hill

Boozo: t'aurais quand même du arrivé avant...   :Twisted Evil:   :Laughing:  .

Babos: tu vas bientôt surfer sur ton nouveau matos .

                                                                                           @+

----------

## boozo

bah en fait j'avais pas fait le lien entre 3145ABG et le 8169/r1000   :Laughing: 

mais bon Search Function is gooood !  :Mr. Green: 

----------

## babos

Super, merci Boozo pour les liens.

Bon, j'ai fini d'installer mon système de base.

J'ai émergé ipw3945 pour la wireless, ensuite je vais installer wireless-tools, toujours grâce à cette magique clé USB.

Pour le r1000, j'ai toujours des problèmes.

J'ai bien fait comme dans le lien que tu m'a doné Boozo, mais voilà,

make clean modules bloque.

Est-ce qu'il y a un moyen, sans serveur X, et donc juste en console, d'imprimer la sortie de cette compile dans un fichier texte?

Comme ça, vous pourrez surement m'éclairer. Bon, je continue en attendant l'install de la wireless.

Merci en tous cas à tous  :Smile: 

Ah oui, je vais peut-être changer le titre du sujet pour ajouter r1000, vous en penser quoi?

----------

## man in the hill

Salut ,

Magique la clé usb, désolé pour le plan ssh sans réseau   :Embarassed:   mais tu pourras t'en servir prochainement ...

En général on rédirige une sortie vers un fichier , par exemple la commande ls :

```
ls > /chemin/fichier
```

le fichier est crée automatiquement !

Je pense qu'avec make cela devrait marcher...

                                                                           @+

----------

## babos

Voilà la sortie, merci Man in the Hill:

```
make -C src/ clean

make[1]: Entering directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

rm -f *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags

make[1]: Leaving directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

make -C src/ modules

make[1]: Entering directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

make -C /lib/modules/2.6.16-gentoo-r9/build SUBDIRS=/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src modules

make[2]: Entering directory `/usr/src/linux-2.6.16-gentoo-r9'

  CC [M]  /usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.o

make[2]: Leaving directory `/usr/src/linux-2.6.16-gentoo-r9'

make[1]: Leaving directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'
```

Mais il manque des trucs parce que sur la console, il ya des erreurs qui s'affichent.

Bon, je vais recopier ça sur papier et vous les transmettre.

[Edit]Voici la vrai fin sur la console :

```
make -C src /modules

make[1] : Entering directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

make -C /lib/modules/2.6.16-gentoo-r9/build SUBDIRS=/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src modules

make[2] : Entering directory `/usr/src/linux-2.6.16-gentoo-r9'

   CC [M] /usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.o

 /usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.c : In function `r1000_close':

/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.c : 1450 : error : `entdev' undeclared (first use in this function)

/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.c : 1450 : error : (Each undeclared identifier is

reported only once

/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.c : 1450 : error : for each fonction it appears in).

make[3] : *** [/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.o] Error1

make[2] : *** [_modules_/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src] Error2

make[2] : Leaving directory `/usr/src/linux-2.6.16-gentoo-r9'

make[1] : *** [modules] Error2

make[1] : Leaving directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

```

Y aurait-il un problème avec les modules configurés dans mon noyau? Pas très bavard ce Make.

Merci d'avance pour l'aide éventuelle.[/Edit]

[Edit2] Pour la wireless, après emerge de ieee80211, ipw3945 et wireless-tools, j'obtiens lorsque je lance iwconfig:

```
iwconfig

1o                   no wireless extensions

sit0                 no wireless extensions

ip6tn10           no wireless extensions
```

Pfff, un oubli dans le noyo? [/Edit2]

----------

## man in the hill

En fait le noyau inclu la sous couche ieee80211, donc vire ce que tu as installé (pas de doublons) , met en dur ds le noyau .

```

Networking --->

 [*] Networking support                                                            

        Networking options  --->                                                    

 [ ]   Amateur Radio support  --->                                               

 < >   IrDA (infrared) subsystem support  --->                                     

 <M>   Bluetooth subsystem support  --->                                             

 <M>   Generic IEEE 802.11 Networking Stack                                         

 [ ]     Enable full debugging output                                              

 <M>     IEEE 802.11 WEP encryption (802.1x)                                       

 < >     IEEE 802.11i CCMP support                                                   

 < >     IEEE 802.11i TKIP encryption
```

ensuite :

```
Device Drivers --->

Network device support --->

Wireless LAN (non-hamradio) --->

[*] Wireless LAN drivers (non-hamradio) & Wireless Extensions
```

Tu installes ton driver , tu le charges...

Doc sur les option du kernel : 

http://casteyde.christian.free.fr/system/linux/guide/online/book1.html

[EDIT]Pour le titre : [Ethernet/Wi-Fi] Installer les drivers r1000/ipw3945 

 Regarde cette page si tu veux plus d'info   https://forums.gentoo.org/viewtopic-t-69179.html  [EDIT]

                                                                                   @+

----------

## babos

Merci pour le titre, j'avoue que je ne savais pas trop quoi mettre

Bon, ca avance à grands pas, ca y est, j'ai mon réseau en wifi!!!!.

Comme il me semblait, le paquet du driver ipw3945 fait une allergie à tout ce qui ressemble à du ieee80211 dans le kernel

Gentoo-sources

Donc lors de l'émerge, impossible tant que je ne vire pas complètement :

Generic IEEE 802.11 Networking Stack

Même en module il refuse l'émerge.

Après portage m'oblige à taper la commande:

```
/bin/sh /usr/portage/net-wireless/ieee80211/file/remove-old usr/src/linux
```

Autrement dit à faire le grand ménage du ieee80211

Après, lémerge fonctionne correctement (pour tester tout cela et en être sûr, j'ai du réemerger plusieurs fois les gentoo-sources, car l'émerge de ipw3945 modifie royalement les sources).

Mais c'est bon, j'ai maintenant le eth0

Là, ca devrait être plus simple maintenant.

Quand je lance iwconfig eth0:

```
iwconfig eth0

eth0   unassociated ESSID : off/any

         Mode : Managed Frequency=nan kHz Access Point : Not-Associated

         Bit Rate : 0 kb/s Tx_Power : 16 dBm

         Retry limit : 15 RTS thr : off Fragment thr : off

         Encryption key : off

         Power Management : off

         Link Quality : 0 Signal level : 0 Noise level : 0

         Rx invalid nwid : 0 Rx invalid crypt : 0 Rx invalid frag : 0

         Tx excessive retries : 0 Invalid mix : 52 Missed beacon : 0
```

Power management off :

```
/etc/init.d/net.eth0 start
```

Et là, oh magie de Linux, les ping fonctionnent

hi, hi, mwen byen contan  :Laughing: 

Bon alors maintenant deux questions pour les gentouïstes et après je ferai peut-être un petit wiki là-dessus pour résumer tout ça

Si vous pensez que cela en vaut la peine:

1) Pourquoi la compile du r1000 se refuse??

2) PLus dur je pense, pourquoi dès que je vais sous Windaub, qui va bientôt d'ailleurs finir au cimetière sur mon portable,

mon module ipw3945 ne se charge plus au démarrage. Je suis obligé de faire un modprobe et de rebooter à chaque fois.

(petite aide : il y a un bouton au-dessus du clavier pour activer le modem sous Windaub).

En tout cas, pour moi, dès maintenant, la vie va changer sous Gentoo, merci à tous et en grand merci à Man in the Hill

----------

## man in the hill

 *babos wrote:*   

> hi, hi, mwen byen contan 

 

Cé tchimbé rèd pa moli   :Wink:   !

 *babos wrote:*   

> Bon alors maintenant deux questions pour les gentouïstes et après je ferai peut-être un petit wiki là-dessus pour résumer tout ça
> 
> Si vous pensez que cela en vaut la peine:

 

Bien sûr que ton expérience pourra aider bien d'autres donc à ranger ds le sous forum Documentations, Astuces et Scripts . 

 *babos wrote:*   

> 1) Pourquoi la compile du r1000 se refuse??

 

Il faut modifier le fichier mal codé en espérant que cela fonctionne , un lien :

http://forums.suselinuxsupport.de/index.php?s=88ebdf3e4fbbe0086c2d69fa4d9b1a55&showtopic=36365&pid=178598&st=20&#entry178598

 *babos wrote:*   

> 2) PLus dur je pense, pourquoi dès que je vais sous Windaub, qui va bientôt d'ailleurs finir au cimetière sur mon portable,
> 
> mon module ipw3945 ne se charge plus au démarrage. Je suis obligé de faire un modprobe et de rebooter à chaque fois.
> 
> (petite aide : il y a un bouton au-dessus du clavier pour activer le modem sous Windaub).

 

Et non c'est le plus facile   :Razz:  , tu le places ds le fichier /etc/modules.autoload.d/kernel-2.6 et il sera automatiquement chargé au démarrage...Par contre je te conseille d'avoir un double-boot  win ou autre chose(sur qques Go)  + gentoo  car si tu as un soucis tu pourras tjrs faire des comparaisons...

                                                                               @+

----------

## babos

Bon, pour r1000, j'ai bien modifier le fichier r1000_n.c mais cela ne change rien du tout.

Pour le ipw3945, merci Man in the Hill, mais j'avais deja place le module dans /etc/modules.autoload.d/kernel-2.6.

Non, en fait il fonctionne une fois sur deux  a chaque redmarrage.

La seule solution pour qu'il fonctionne que j'ai trouve :

modprobe ipw3945 et un reboot par-dessus.

Ce n'est pas lie a windows puisque meme lorsque je reste sous linux, j'ai le probleme.

Donc s'il y a d'autres idees, merci d'avance.

----------

## geekounet

 *man in the hill wrote:*   

>  *babos wrote:*   hi, hi, mwen byen contan  
> 
> Cé tchimbé rèd pa moli    !

 

Pas compris ^^ ... déjà que j'ai un peu de mal avec le créole réunionnais ^^ ...

----------

## man in the hill

 *pierreg wrote:*   

>  *man in the hill wrote:*    *babos wrote:*   hi, hi, mwen byen contan  
> 
> Cé tchimbé rèd pa moli    ! 
> 
> Pas compris ^^ ... déjà que j'ai un peu de mal avec le créole réunionnais ^^ ...

 

Que du classique , Babos me disait qu'il était heureux (content)...et je lui ai répondu un classique de l'expression martiniquaise:  ne baisse pas les bras mais qui est plus fort que ça ds la mentalité du peuple : ne baisse jamais les bras . 

Si on regarde de plus près :

mwen = je suis , j'ai    

C'est surement un dérivé du pronom personnel moi...

byen = bien 

petite modif !

contan = content 

petite modif !

tchimbé = signifie tenir,  par ex: tchimbé ça = tient moi ça .

rèd = vient du mot raide (qui ne se plit pas) .

pa :  c'est la négation en créole .

moli = mollir 

L'expression que j'ai cité peut-être vu comme un mec qui reste fort devant l'adversité.

Bon, je ne suis pas linguiste donc une interpétation à la volée...

                                                                                   @+

----------

## geekounet

Ok, merci pour les explications  :Smile:  J'ai appris une nouvelle langue aujourd'hui ^^

En fait, la phrase de babos j'avais réussi à la comprendre, mais pas la tienne  :Smile: 

----------

## man in the hill

 *babos wrote:*   

> Bon, pour r1000, j'ai bien modifier le fichier r1000_n.c mais cela ne change rien du tout.
> 
> Pour le ipw3945, merci Man in the Hill, mais j'avais deja place le module dans /etc/modules.autoload.d/kernel-2.6.
> 
> Non, en fait il fonctionne une fois sur deux  a chaque redmarrage.
> ...

 

J'imagine que tu as bien remplit la section Loadable module support ---> ds le kernel .

Tu n'as pas besoin de rebooter théoriquement , le driver fait sont boulot dès qu'il est monté.

Une solution provisoire est de mettre la commande ds un fichier qui sera exécuté au démarrage (c'est le travail de /etc/modules.autoload.d/kernel-2.6), donc ds un fichier :

```

#!/bin/bash

modprobe   ipw3945

```

Tu le rend exécutable :

```
chmod +x  /chemin/fichier
```

tu le places ds le répertoire :

```
/usr/bin/
```

tu vas de le répertoire init.d pour fair un lien symbolique vers ton fichier :

```
 cd  /etc/init.d/

ln -s /usr/bin/ton_fichier    nom_que_tu_donnes_au_lien
```

 tu le rajoutes au runlevel boot pour que le driver soit monté avant l'initialisation de ta carte wifi au runlevel default:

```
rc-update  add  nom_du_lien_symbolique   boot
```

Sinon, un fois le driver monté , est-ce que cela fontionne bien ?

Ds le cas contraire vérifie les options du noyau...

Colle moi cette commande:

```
eselect  rc list
```

Pour ton autre driver, colle le fichier qui pose problème.

[EDIT] @Pierreg : De rien , c'est plutôt positif d'être curieux à d'autres cultures   :Laughing: , je dois t'avouer qu'ayant vécu des années en banlieue parisienne avant de rentrer au pays mon language est  devenu un mix du créole de mon enfance et du français de ma vie parisienne...[/EDIT]     

                                                                                   @+

----------

## babos

Bon, j'avais bien s^ur bien activé le support pour les modules chargeables dans mon noyau.

En fait, le problème est plus simple ou plus complexe : le module ne se charge qu'une fois sur deux au démarrage.

Peu importe le fait d'exécuter modprobe ou de ne pas le faire, c'est toujours une fois sur deux.  :Smile: 

Bon, j'ai essayé ce que tu m'as dit Man in the Hill, mais il refuse:

could not get dependency info

Il me conseille alors de'essayer /sbin/depscan.sh mais cela ne donne rien.

En fait, je suis s^ur que j'essaie de charger le mauvais fichier: file:///etc/modules.d/ipw3945

J'ai bien trouvé deux autres dossiers vers lesquels mon coeur pencherait mais quel fichier dans ces dossiers:

file:///sys/module/ipw3945

file:///sys/bus/pci/drivers/ipw3945

Bon, du coup j'ai retiré le fichier du boot.

Après cela, la commande que tu m'a demandé:

```
Gentux ~ # eselect rc list

Available init scripts

  alsasound                 boot

  bootmisc                  boot

  checkfs                   boot

  checkroot                 boot

  clock                     boot

  coldplug                  default

  consolefont               boot

  crypto-loop

  cupsd

  dbus                      default

  domainname                boot default

  esound

  gpm

  hald                      default

  hdparm

  hostname                  boot

  hotplug

  ip6tables

  iptables

  ivman                     default

  keymaps                   boot

  local                     default nonetwork

  localmount                boot

  metalog                   default

  modules                   boot

  net.eth0                  default

  net.lo                    boot

  netmount                  default

  nscd

  numlock

  pwcheck

  rmnologin                 boot

  rsyncd

  saslauthd

  sshd

  urandom                   boot

  vixie-cron

  xdm                       default
```

Bon, pour le r1000:

L'erreur lors du make:

```
Gentux ~ # cd /usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000

Gentux r1000 # make clean modules

make -C src/ clean

make[1]: Entering directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

rm -f *.o *.ko *~ core* .dep* .*.d .*.cmd *.mod.c *.a *.s .*.flags

make[1]: Leaving directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

make -C src/ modules

make[1]: Entering directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

make -C /lib/modules/2.6.16-gentoo-r9/build SUBDIRS=/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src modules

make[2]: Entering directory `/usr/src/linux-2.6.16-gentoo-r9'

  CC [M]  /usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.o

/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.c: In function `r1000_close':

/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.c:1450: erreur: « entdev » non déclaré (première utilisation dans cette fonction)

/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.c:1450: erreur: (Chaque identificateur non déclaré est rapporté une seule fois

/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.c:1450: erreur: pour chaque fonction dans laquelle il apparaît.)

make[3]: *** [/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src/r1000_n.o] Erreur 1

make[2]: *** [_module_/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src] Erreur 2

make[2]: Leaving directory `/usr/src/linux-2.6.16-gentoo-r9'

make[1]: *** [modules] Erreur 2

make[1]: Leaving directory `/usr/src/linux-2.6.16-gentoo-r9/drivers/net/r1000/r1000/src'

make: *** [modules] Erreur 2
```

Et le fichier r1000_n.c:

[code:1:db6b2140cf]Gentux r1000 # ls

Makefile  README  release_note.txt  src

Gentux r1000 # ls src

Makefile           Makefile_linux26x  r1000_ioctl.c

Makefile_linux24x  r1000.h            r1000_n.c

Gentux r1000 # less src/r1000_n.c 

//=========================================================================

//Realtek Ethernet driver for Linux kernel 2.4.x. and 2.6.x

//=========================================================================

#include "r1000.h"

static int media[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};

/* Maximum events (Rx packets, etc.) to handle at each interrupt. */

static int max_interrupt_work = 20;

/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast).

   The RTL chips use a 64 element hash table based on the Ethernet CRC.  */

static int multicast_filter_limit = 32;

const static struct {

	const char *name;

	u8 mcfg;		 /* depend on documents of Realtek */

	u32 RxConfigMask; 	/* should clear the bits supported by this chip */

} rtl_chip_info[] = {

	{ "RTL8169",  MCFG_METHOD_1,  0xff7e1880 },

	{ "RTL8169S/8110S",  MCFG_METHOD_2,  0xff7e1880 },

	{ "RTL8169S/8110S",  MCFG_METHOD_3,  0xff7e1880 },

	{ "RTL8169SB/8110SB",  MCFG_METHOD_4,  0xff7e1880 },

	{ "RTL8169SC/8110SC",  MCFG_METHOD_5,  0xff7e1880 },

	{ "RTL8168B/8111B",  MCFG_METHOD_11,  0xff7e1880 },

	{ "RTL8168B/8111B",  MCFG_METHOD_12,  0xff7e1880 },

	{ "RTL8101E",  MCFG_METHOD_13,  0xff7e1880 },

	{ "RTL8100E",  MCFG_METHOD_14,  0xff7e1880 },

	{ "RTL8100E",  MCFG_METHOD_15,  0xff7e1880 },

	{ 0 }

};

static struct pci_device_id r1000_pci_tbl[] __devinitdata = {

	{ 0x10ec, 0x8169, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },

	{ 0x10ec, 0x8167, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },

	{ 0x10ec, 0x8168, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },

	{ 0x10ec, 0x8136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },

	{0,}

};

MODULE_DEVICE_TABLE (pci, r1000_pci_tbl);

MODULE_AUTHOR ("Realtek");

MODULE_DESCRIPTION ("Linux device driver for Realtek Ethernet Controllers");

MODULE_PARM_DESC (media, "1-" __MODULE_STRING(MAX_UNITS) "i");

MODULE_LICENSE("GPL");

static int r1000_open (struct net_device *netdev);

static int r1000_start_xmit (struct sk_buff *skb, struct net_device *netdev);

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)

//typedef	int				irqreturn_t;

#define	IRQ_NONE		0

#define	IRQ_HANDLED		1

static void r1000_interrupt (int irq, void *dev_instance, struct pt_regs *regs);

#else

static irqreturn_t r1000_interrupt (int irq, void *dev_instance, struct pt_regs *regs);

#endif

static void r1000_init_ring (struct net_device *netdev);

static void r1000_hw_start (struct net_device *netdev);

static int r1000_close (struct net_device *netdev);

static inline u32 ether_crc (int length, unsigned char *data);

static void r1000_set_rx_mode (struct net_device *netdev);

static void r1000_tx_timeout (struct net_device *netdev);

static struct net_device_stats *r1000_get_stats(struct net_device *netdev);

#ifdef R1000_JUMBO_FRAME_SUPPORT

static int r1000_change_mtu(struct net_device *netdev, int new_mtu);

#endif //end #ifdef R1000_JUMBO_FRAME_SUPPORT

static void r1000_hw_PHY_config (struct net_device *netdev);

static void r1000_hw_PHY_reset(struct net_device *netdev);

static const u16 r1000_intr_mask = LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK ;

static const unsigned int r1000_rx_config = (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift) | 0x0000000E;

static int r1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);

extern int ethtool_ioctl(struct ifreq *ifr);

extern struct ethtool_ops r1000_ethtool_ops;

int r1000_set_speed_duplex(unsigned long ioaddr, unsigned int anar, unsigned int gbcr, unsigned int bmcr);

#ifdef R1000_DEBUG

unsigned alloc_rxskb_cnt = 0;

#define R1000_ALLOC_RXSKB(bufsize) 	dev_alloc_skb(bufsize); alloc_rxskb_cnt ++ ;

#define R1000_FREE_RXSKB(skb) 	kfree_skb(skb); alloc_rxskb_cnt -- ;

#define R1000_NETIF_RX(skb) 		netif_rx(skb); alloc_rxskb_cnt -- ;

#else

#define R1000_ALLOC_RXSKB(bufsize) 	dev_alloc_skb(bufsize);

#define R1000_FREE_RXSKB(skb) 	kfree_skb(skb);

#define R1000_NETIF_RX(skb) 		netif_rx(skb);

#endif //end #ifdef R1000_DEBUG

//=================================================================

//	PHYAR

//	bit		Symbol

//	31		Flag

//	30-21	reserved

//	20-16	5-bit GMII/MII register address

//	15-0	16-bit GMII/MII register data

//=================================================================

void R1000_WRITE_GMII_REG( unsigned long ioaddr, int RegAddr, int value )

{

	int	i;

	RTL_W32 ( PHYAR, 0x80000000 | (RegAddr&0xFF)<<16 | value);

	udelay(1000);

	for( i = 2000; i > 0 ; i -- ){

		// Check if the RTL8169 has completed writing to the specified MII register

		if( ! (RTL_R32(PHYAR)&0x80000000) ){

			break;

		}

		else{

			udelay(100);

		}// end of if( ! (RTL_R32(PHYAR)&0x80000000) )

	}// end of for() loop

}

//=================================================================

int R1000_READ_GMII_REG( unsigned long ioaddr, int RegAddr )

{

	int i, value = -1;

	RTL_W32 ( PHYAR, 0x0 | (RegAddr&0xFF)<<16 );

	udelay(1000);

	for( i = 2000; i > 0 ; i -- ){

		// Check if the RTL8169 has completed retrieving data from the specified MII register

		if( RTL_R32(PHYAR) & 0x80000000 ){

			value = (int)( RTL_R32(PHYAR)&0xFFFF );

			break;

		}

		else{

			udelay(100);

		}// end of if( RTL_R32(PHYAR) & 0x80000000 )

	}// end of for() loop

	return value;

}

void r1000_phy_timer_t_handler( void	*timer_data )

{

	struct net_device *netdev = (struct net_device *)timer_data;

	struct r1000_private *priv = (struct r1000_private *) (netdev->priv);

	unsigned long ioaddr = priv->ioaddr;

	assert( priv->mcfg > MCFG_METHOD_1 );

	assert( priv->pcfg < PCFG_METHOD_3 );

	if( RTL_R8(PHYstatus) & LinkStatus ){

		priv->phy_link_down_cnt = 0 ;

	}

	else{

		priv->phy_link_down_cnt ++ ;

		if( priv->phy_link_down_cnt >= 12 ){

			// If link on 1000, perform phy reset.

			if( R1000_READ_GMII_REG( ioaddr, PHY_1000_CTRL_REG ) & PHY_Cap_1000_Full )

			{

				DBG_PRINT("r1000_hw_PHY_reset\n");

				r1000_hw_PHY_reset(netdev);

			}

			priv->phy_link_down_cnt = 0 ;

		}

	}

	//---------------------------------------------------------------------------

	//mod_timer is a more efficient way to update the expire field of an active timer.

	//---------------------------------------------------------------------------

//	r1000_mod_timer( (&priv->phy_timer_t), 100 );

}

void r1000_timer_handler( void *timer_data )

{

	struct net_device *netdev = (struct net_device *)timer_data;

	struct r1000_private *priv = (struct r1000_private *) (netdev->priv);

	if( (priv->mcfg > MCFG_METHOD_1) && (priv->pcfg < PCFG_METHOD_3) ){

		DBG_PRINT("FIX PCS -> r1000_phy_timer_t_handler\n");

		priv->phy_link_down_cnt = 0;

		r1000_phy_timer_t_handler( timer_data );

	}

#ifdef R1000_DYNAMIC_CONTROL

	{

		struct r1000_cb_t *rt = &(priv->rt);

		if( priv->linkstatus == _1000_Full ){

			r1000_callback(rt);

		}

	}

#endif //end #ifdef R1000_DYNAMIC_CONTROL

	r1000_mod_timer( (&priv->r1000_timer), priv->expire_time );

}

int r1000_set_speed_duplex(unsigned long ioaddr, unsigned int anar, unsigned int gbcr, unsigned int bmcr){

	unsigned int i = 0;

	unsigned int bmsr;

	R1000_WRITE_GMII_REG(ioaddr,PHY_AUTO_NEGO_REG,anar);

	R1000_WRITE_GMII_REG(ioaddr,PHY_1000_CTRL_REG,gbcr);

	R1000_WRITE_GMII_REG(ioaddr,PHY_CTRL_REG,bmcr);

	for(i=0;i<10000;i++){

		bmsr = R1000_READ_GMII_REG(ioaddr,PHY_STAT_REG);

		if(bmsr&PHY_Auto_Neco_Comp)

			return 0;

	}

	return -1;	

}

static int __devinit r1000_init_board ( struct pci_dev *pdev, struct net_device **netdev_out, unsigned long *ioaddr_out)

{

	unsigned long ioaddr = 0;

	struct net_device *netdev;

	struct r1000_private *priv;

	int rc, i;

#ifndef R1000_USE_IO

	unsigned long mmio_start, mmio_end, mmio_flags, mmio_len;

#endif

	assert (pdev != NULL);

	assert (ioaddr_out != NULL);

	*ioaddr_out = 0;

	*netdev_out = NULL;

	// dev zeroed in init_etherdev

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)

	netdev = init_etherdev (NULL, sizeof (*priv));

#else

	netdev = alloc_etherdev (sizeof (*priv));

#endif

	if (netdev == NULL) {

		printk (KERN_ERR PFX "unable to alloc new ethernet\n");

		return -ENOMEM;

	}

	SET_MODULE_OWNER(netdev);

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)

	SET_NETDEV_DEV(netdev, &pdev->dev);

#endif

	priv = netdev->priv;

	// enable device (incl. PCI PM wakeup and hotplug setup)

	rc = pci_enable_device (pdev);

	if (rc)

		goto err_out;

#ifndef R1000_USE_IO

	mmio_start = pci_resource_start (pdev, 1);

	mmio_end = pci_resource_end (pdev, 1);

	mmio_flags = pci_resource_flags (pdev, 1);

	mmio_len = pci_resource_len (pdev, 1);

	// make sure PCI base addr 1 is MMIO

	if (!(mmio_flags & IORESOURCE_MEM)) {

		printk (KERN_ERR PFX "region #1 not an MMIO resource, aborting\n");

		rc = -ENODEV;

		goto err_out;

	}

	// check for weird/broken PCI region reporting

	if ( mmio_len < RTL_MIN_IO_SIZE ) {

		printk (KERN_ERR PFX "Invalid PCI region size(s), aborting\n");

		rc = -ENODEV;

		goto err_out;

	}

#endif

	rc = pci_request_regions (pdev, netdev->name);

	if (rc)

		goto err_out;

	// enable PCI bus-mastering

	pci_set_master (pdev);

#ifdef R1000_USE_IO

	ioaddr = pci_resource_start(pdev, 0);

#else

	// ioremap MMIO region

	ioaddr = (unsigned long)ioremap (mmio_start, mmio_len);

	if (ioaddr == 0) {

		printk (KERN_ERR PFX "cannot remap MMIO, aborting\n");

		rc = -EIO;

		goto err_out_free_res;

	}

#endif

	// Soft reset the chip.

	RTL_W8 ( ChipCmd, CmdReset);

	// Check that the chip has finished the reset.

	for (i = 1000; i > 0; i--){

		if ( (RTL_R8(ChipCmd) & CmdReset) == 0){

			break;

		}

		else{

			udelay (10);

		}

	}

	// identify config method

	{

		unsigned long val32 = (RTL_R32(TxConfig)&0x7c800000);

		if( val32 == 0x38800000)

			priv->mcfg = MCFG_METHOD_15;

		else if( val32 == 0x30800000)

			priv->mcfg = MCFG_METHOD_14;

		else if( val32 == 0x34000000)

			priv->mcfg = MCFG_METHOD_13;

		else if( val32 == 0x38000000)

			priv->mcfg = MCFG_METHOD_12;

		else if( val32 == 0x30000000)

			priv->mcfg = MCFG_METHOD_11;

		else if( val32 == 0x18000000)

			priv->mcfg = MCFG_METHOD_5;

		else if( val32 == 0x10000000 )

			priv->mcfg = MCFG_METHOD_4;

		else if( val32 == 0x04000000 )

			priv->mcfg = MCFG_METHOD_3;

		else if( val32 == 0x00800000 )

			priv->mcfg = MCFG_METHOD_2;

		else if( val32 == 0x00000000 )

			priv->mcfg = MCFG_METHOD_1;

		else

			priv->mcfg = MCFG_METHOD_1;

	}

	{

		unsigned char val8 = (unsigned char)(R1000_READ_GMII_REG(ioaddr,3)&0x000f);

		if( val8 == 0x00 ){

			priv->pcfg = PCFG_METHOD_1;

		}

		else if( val8 == 0x01 ){

			priv->pcfg = PCFG_METHOD_2;

		}

		else if( val8 == 0x02 ){

			priv->pcfg = PCFG_METHOD_3;

		}

		else{

			priv->pcfg = PCFG_METHOD_3;

		}

	}

	for (i = ARRAY_SIZE (rtl_chip_info) - 1; i >= 0; i--){

		if (priv->mcfg == rtl_chip_info[i].mcfg) {

			priv->chipset = i;

			goto match;

		}

	}

	//if unknown chip, assume array element #0, original RTL-8169 in this case

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)

	printk (KERN_DEBUG PFX "PCI device %s: unknown chip version, assuming RTL-8169\n", pdev->slot_name);

#endif

	priv->chipset = 0;

match:

	*ioaddr_out = ioaddr;

	*netdev_out = netdev;

	return 0;

#ifndef R1000_USE_IO

err_out_free_res:

	pci_release_regions (pdev);

#endif

err_out:

	unregister_netdev(netdev);

	kfree(netdev);

	return rc;

}

static int r1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd){

	if(!netif_running(netdev))

		return -EINVAL;

	switch(cmd){

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)

	case SIOCETHTOOL:

		return ethtool_ioctl(ifr);

#endif

	default:

		return -EOPNOTSUPP;

	}

}

//======================================================================================================

static int __devinit r1000_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)

{

	struct net_device *netdev = NULL;

	struct r1000_private *priv = NULL;

	unsigned long ioaddr = 0;

	static int board_idx = -1;

	int i,rc;

	int option = -1, Cap10_100 = 0, Cap1000 = 0;

	int val=0,bmcr=0;

	assert (pdev != NULL);

	assert (ent != NULL);

	board_idx++;

	i = r1000_init_board (pdev, &netdev, &ioaddr);

	if (i < 0) {

		return i;

	}

	priv = netdev->priv;

	assert (ioaddr != NULL);

	assert (netdev != NULL);

	assert (priv != NULL);

	// Get MAC address //

	for (i = 0; i < MAC_ADDR_LEN ; i++){

		netdev->dev_addr[i] = RTL_R8( MAC0 + i );

	}

	netdev->open		= r1000_open;

	netdev->hard_start_xmit	= r1000_start_xmit;

	netdev->get_stats    	= r1000_get_stats;

	netdev->stop 		= r1000_close;

	netdev->tx_timeout 	= r1000_tx_timeout;

	netdev->set_multicast_list = r1000_set_rx_mode;

	netdev->watchdog_timeo 	= TX_TIMEOUT;

	netdev->irq 		= pdev->irq;

	netdev->base_addr 	= (unsigned long) ioaddr;

#ifdef R1000_JUMBO_FRAME_SUPPORT

	netdev->change_mtu	= r1000_change_mtu;

#endif //end #ifdef R1000_JUMBO_FRAME_SUPPORT

	netdev->do_ioctl 	= r1000_ioctl;

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)

	netdev->ethtool_ops	= &r1000_ethtool_ops;

#endif

#ifdef R1000_DYNAMIC_CONTROL

	priv->rt.dev = netdev;

#endif //end #ifdef R1000_DYNAMIC_CONTROL

	priv = netdev->priv;				// private data //

	priv->pci_dev 	= pdev;

	priv->ioaddr 	= ioaddr;

//#ifdef R1000_JUMBO_FRAME_SUPPORT

	priv->curr_mtu_size = netdev->mtu;

	priv->tx_pkt_len = netdev->mtu + ETH_HDR_LEN;

	priv->rx_pkt_len = netdev->mtu + ETH_HDR_LEN;

	priv->hw_rx_pkt_len = priv->rx_pkt_len + 8;

//#endif //end #ifdef R1000_JUMBO_FRAME_SUPPORT

	DBG_PRINT("-------------------------- \n");

	DBG_PRINT("netdev->mtu = %d \n", netdev->mtu);

	DBG_PRINT("priv->curr_mtu_size = %d \n", priv->curr_mtu_size);

	DBG_PRINT("priv->tx_pkt_len = %d \n", priv->tx_pkt_len);

	DBG_PRINT("priv->rx_pkt_len = %d \n", priv->rx_pkt_len);

	DBG_PRINT("priv->hw_rx_pkt_len = %d \n", priv->hw_rx_pkt_len);

	DBG_PRINT("-------------------------- \n");

	spin_lock_init (&priv->lock);

	rc = register_netdev(netdev);

	if(rc){

#ifndef R1000_USE_IO

		iounmap ((void *)(netdev->base_addr));

#endif

		pci_release_regions(pdev);

		pci_disable_device(pdev);

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)

		kfree(netdev);

#else

		free_netdev(netdev);

#endif

		return rc;

	}

	pci_set_drvdata(pdev,netdev);     //      pdev->driver_data = data;

	printk (KERN_DEBUG "%s: Identified chip type is '%s'.\n",netdev->name,rtl_chip_info[priv->chipset].name);

	printk (KERN_INFO "%s: %s at 0x%lx, "

				"%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x, "

				"IRQ %d\n",

				netdev->name,

				R1000_DRIVER_NAME,

				netdev->base_addr,

				netdev->dev_addr[0],netdev->dev_addr[1],

				netdev->dev_addr[2],netdev->dev_addr[3],

				netdev->dev_addr[4],netdev->dev_addr[5],

				netdev->irq);

	// Config PHY

	r1000_hw_PHY_config(netdev);

	DBG_PRINT("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");

	RTL_W8( 0x82, 0x01 );

	if( priv->mcfg < MCFG_METHOD_3 ){

		DBG_PRINT("Set PCI Latency=0x40\n");

		pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40);

	}

	if( priv->mcfg == MCFG_METHOD_2 ){

		DBG_PRINT("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");

		RTL_W8( 0x82, 0x01 );

		DBG_PRINT("Set PHY Reg 0x0bh = 0x00h\n");

		R1000_WRITE_GMII_REG( ioaddr, 0x0b, 0x0000 );	//w 0x0b 15 0 0

	}

	// if TBI is not endbled

	if( !(RTL_R8(PHYstatus) & TBI_Enable) ){

		val = R1000_READ_GMII_REG( ioaddr, PHY_AUTO_NEGO_REG );

#ifdef R1000_HW_FLOW_CONTROL_SUPPORT

		val |= PHY_Cap_PAUSE | PHY_Cap_ASYM_PAUSE ;

#endif //end #define R1000_HW_FLOW_CONTROL_SUPPORT

		option = (board_idx >= MAX_UNITS) ? 0 : media[board_idx];

		// Force Realtek Ethernet Controller in 10/100/1000Mpbs Full/Half-duplex mode.

		if( option > 0 ){

			printk(KERN_INFO "%s: Force-mode Enabled. \n",netdev->name);

			Cap10_100 = 0;

			Cap1000 = 0;

			switch( option ){

				case _10_Half:

					Cap10_100 = PHY_Cap_10_Half;

					Cap1000 = PHY_Cap_Null;

					break;

				case _10_Full:

					Cap10_100 = PHY_Cap_10_Full | PHY_Cap_10_Half;

					Cap1000 = PHY_Cap_Null;

					break;

				case _100_Half:

					if(priv->mcfg!=MCFG_METHOD_13)

						Cap10_100 = PHY_Cap_100_Half | PHY_Cap_10_Full | PHY_Cap_10_Half;

					else

						Cap10_100 = 0x0081;

						Cap1000 = PHY_Cap_Null;

						break;

				case _100_Full:

					Cap10_100 = PHY_Cap_100_Full | PHY_Cap_100_Half | PHY_Cap_10_Full | PHY_Cap_10_Half;

					Cap1000 = PHY_Cap_Null;

					break;

				case _1000_Full:

						Cap10_100 = PHY_Cap_100_Full | PHY_Cap_100_Half | PHY_Cap_10_Full | PHY_Cap_10_Half;

					if((priv->mcfg==MCFG_METHOD_13)||(priv->mcfg==MCFG_METHOD_14)||(priv->mcfg==MCFG_METHOD_15))

						printk("This Realtek NIC doesn't support 1000Mbps\n");

					else

						Cap1000 = PHY_Cap_1000_Full|PHY_Cap_1000_Half;

					break;

				default:

					Cap10_100 = PHY_Cap_100_Full | PHY_Cap_100_Half | PHY_Cap_10_Full | PHY_Cap_10_Half;

					Cap1000 = PHY_Cap_Null;

					break;

			}

			//flow control enable

			Cap10_100 |=  val&0xC1F;

		}else{

			printk(KERN_INFO "%s: Auto-negotiation Enabled.\n",netdev->name);

			// enable 10/100 Full/Half Mode, leave PHY_AUTO_NEGO_REG bit4:0 unchanged

			Cap10_100 = PHY_Cap_10_Half | PHY_Cap_10_Full | PHY_Cap_100_Half | PHY_Cap_100_Full | ( val&0xC1F );

			// enable 1000 Full Mode

			if((priv->mcfg!=MCFG_METHOD_13)&&(priv->mcfg!=MCFG_METHOD_14)&&(priv->mcfg!=MCFG_METHOD_15))

				Cap1000 = PHY_Cap_1000_Full | PHY_Cap_1000_Half;

		}// end of if( option > 0 )

		bmcr = PHY_Enable_Auto_Nego | PHY_Restart_Auto_Nego;

		r1000_set_speed_duplex(ioaddr,Cap10_100,Cap1000,bmcr);

		option = RTL_R8(PHYstatus);

		if( option & _1000Mbps ){

			priv->linkstatus = _1000_Full;

		}else{

			if(option & _100Mbps){

				priv->linkstatus = (option & FullDup) ? _100_Full : _100_Half;

			}else{

				priv->linkstatus = (option & FullDup) ? _10_Full : _10_Half;

			}

		}

			DBG_PRINT("priv->linkstatus = 0x%02x\n", priv->linkstatus);

	}// end of TBI is not enabled

	else{

		udelay(100);

		DBG_PRINT("1000Mbps Full-duplex operation, TBI Link %s!\n",(RTL_R32(TBICSR) & TBILinkOK) ? "OK" : "Failed" );

	}// end of TBI is not enabled

	//show some information after the driver is inserted

	if(( priv->mcfg == MCFG_METHOD_11 )||( priv->mcfg == MCFG_METHOD_12 ))

		printk("Realtek RTL8168/8111 Family PCI-E Gigabit Ethernet Network Adapter\n");

	else if((priv->mcfg==MCFG_METHOD_13)||(priv->mcfg==MCFG_METHOD_14)||(priv->mcfg==MCFG_METHOD_15))

		printk("Realtek RTL8139/810x Family Fast Ethernet Network Adapter\n");

	else

		printk("Realtek RTL8169/8110 Family Gigabit Ethernet Network Adapter\n");

	printk("Driver version:%s\n",R1000_VERSION);

	printk("Released date:%s\n",RELEASE_DATE);

	if(RTL_R8(PHYstatus) & LinkStatus){

		printk("Link Status:%s\n","Linked");

		if(RTL_R8(PHYstatus) & _1000Mbps)

			printk("Link Speed:1000Mbps\n");

		else if(RTL_R8(PHYstatus) & _100Mbps)

			printk("Link Speed:100Mbps\n");

		else if(RTL_R8(PHYstatus) & _10Mbps)

			printk("Link Speed:10Mbps\n");

		printk("Duplex mode:%s\n",RTL_R8(PHYstatus)&FullDup?"Full-Duplex":"Half-Duplex");

	}else{

		printk("Link Status:%s\n","Not Linked");

	}

#ifdef R1000_USE_IO

	printk("I/O Base:0x%X(I/O port)\n",(unsigned int)(priv->ioaddr));

#else

	printk("I/O Base:0x%X(I/O memory)\n",(unsigned int)(priv->ioaddr));

#endif	//R1000_USE_IO

	printk("IRQ:%d\n",netdev->irq);

	return 0;

}

static void __devexit r1000_remove_one (struct pci_dev *pdev)

{

	struct net_device *netdev = pci_get_drvdata(pdev);

	assert (netdev != NULL);

	assert (priv != NULL);

	unregister_netdev(netdev);

#ifndef R1000_USE_IO

	iounmap ((void *)(netdev->base_addr));

#endif

	pci_release_regions (pdev);

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)

	kfree(netdev);

#else

	free_netdev(netdev);

#endif

	pci_set_drvdata (pdev, NULL);

}

static int r1000_open (struct net_device *netdev)

{

	struct r1000_private *priv = netdev->priv;

	struct pci_dev *pdev = priv->pci_dev;

	int retval;

//	u8 diff;

//	u32 TxPhyAddr, RxPhyAddr;

	if( priv->drvinit_fail == 1 ){

		printk("%s: Gigabit driver open failed.\n", netdev->name );

		return -ENOMEM;

	}

	retval = request_irq (netdev->irq, r1000_interrupt, SA_SHIRQ, netdev->name, netdev);

	if (retval) {

		return retval;

	}

	//2004-05-11

	// Allocate tx/rx descriptor space

	priv->sizeof_txdesc_space = NUM_TX_DESC * sizeof(struct TxDesc)+256;

	priv->txdesc_space = pci_alloc_consistent( pdev, priv->sizeof_txdesc_space, &priv->txdesc_phy_dma_addr );

	if( priv->txdesc_space == NULL ){

		printk("%s: Gigabit driver alloc txdesc_space failed.\n", netdev->name );

		return -ENOMEM;

	}

	priv->sizeof_rxdesc_space = NUM_RX_DESC * sizeof(struct RxDesc)+256;

	priv->rxdesc_space = pci_alloc_consistent( pdev, priv->sizeof_rxdesc_space, &priv->rxdesc_phy_dma_addr );

	if( priv->rxdesc_space == NULL ){

		printk("%s: Gigabit driver alloc rxdesc_space failed.\n", netdev->name );

		return -ENOMEM;

	}

	if(priv->txdesc_phy_dma_addr & 0xff){

		printk("%s: Gigabit driver txdesc_phy_dma_addr is not 256-bytes-aligned.\n", netdev->name );

	}

	if(priv->rxdesc_phy_dma_addr & 0xff){

		printk("%s: Gigabit driver rxdesc_phy_dma_addr is not 256-bytes-aligned.\n", netdev->name );

	}

	// Set tx/rx descriptor space

	priv->TxDescArray = (struct TxDesc *)priv->txdesc_space;

	priv->RxDescArray = (struct RxDesc *)priv->rxdesc_space;

	{

		int i;

		struct sk_buff *skb = NULL;

		for(i=0;i<NUM_RX_DESC;i++){

			skb = R1000_ALLOC_RXSKB(MAX_RX_SKBDATA_SIZE);

			if( skb != NULL ) {

				skb_reserve (skb, 8);	// 16 byte align the IP fields. //

				priv->Rx_skbuff[i] = skb;

			}

			else{

				printk("%s: Gigabit driver failed to allocate skbuff.\n", netdev->name);

				priv->drvinit_fail = 1;

			}

		}

	}

	//////////////////////////////////////////////////////////////////////////////

	r1000_init_ring(netdev);

	r1000_hw_start(netdev);

	// ------------------------------------------------------

	DBG_PRINT("FIX PCS -> r1000_request_timer\n");

	priv->expire_time = R1000_TIMER_EXPIRE_TIME;

	r1000_request_timer( (&priv->r1000_timer), priv->expire_time, r1000_timer_handler, ((void *)netdev) );  //in open()

	DBG_PRINT("%s: %s() alloc_rxskb_cnt = %d\n", netdev->name, __FUNCTION__, alloc_rxskb_cnt );

	return 0;

}//end of r1000_open (struct net_device *netdev)

static void r1000_hw_PHY_reset(struct net_device *netdev)

{

	int val, phy_reset_expiretime = 50;

	struct r1000_private *priv = netdev->priv;

	unsigned long ioaddr = priv->ioaddr;

	DBG_PRINT("%s: Reset RTL8169s PHY\n", netdev->name);

	val = ( R1000_READ_GMII_REG( ioaddr, 0 ) | 0x8000 ) & 0xffff;

	R1000_WRITE_GMII_REG( ioaddr, 0, val );

	do //waiting for phy reset

	{

		if( R1000_READ_GMII_REG( ioaddr, 0 ) & 0x8000 ){

			phy_reset_expiretime --;

			udelay(100);

		}

		else{

			break;

		}

	}while( phy_reset_expiretime >= 0 );

	assert( phy_reset_expiretime > 0 );

}

static void r1000_hw_PHY_config (struct net_device *netdev)

{

	struct r1000_private *priv = netdev->priv;

	void *ioaddr = (void*)priv->ioaddr;

	DBG_PRINT("priv->mcfg=%d, priv->pcfg=%d\n",priv->mcfg,priv->pcfg);

	if( priv->mcfg == MCFG_METHOD_4 ){

#if 0

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0001 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1b, 0x841e );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x0e, 0x7bfb );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x09, 0x273a );

#endif

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0002 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x90D0 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0000 );

	}else if((priv->mcfg == MCFG_METHOD_2)||(priv->mcfg == MCFG_METHOD_3)){

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1f, 0x0001 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x06, 0x006e );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x08, 0x0708 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x15, 0x4000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x18, 0x65c7 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1f, 0x0001 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0x00a1 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0x0008 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x0120 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x1000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xff41 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xdf60 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x0140 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x0077 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x7800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x7000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0x802f );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0x4f02 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x0409 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0xf0f9 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x9800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x9000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xdf01 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xdf20 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0xff95 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0xba00 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xa800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xa000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xff41 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xdf20 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x0140 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x00bb );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xb800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xb000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xdf41 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xdc60 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x6340 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x007d );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xd800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xd000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xdf01 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xdf20 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x100a );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0xa0ff );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xf800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xf000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1f, 0x0000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x0b, 0x0000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x9200 );

#if 0

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0001 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x15, 0x1000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x18, 0x65C7 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0x00A1 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0x0008 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x1020 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x1000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x7000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xFF41 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xDE60 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x0140 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x0077 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x7800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x7000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xA000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xDF01 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xDF20 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0xFF95 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0xFA00 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xA800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xA000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xB000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xFF41 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xDE20 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0x0140 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0x00BB );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xB800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xB000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xF000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x03, 0xDF01 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x02, 0xDF20 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x01, 0xFF95 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x00, 0xBF00 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xF800 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0xF000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x04, 0x0000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x1F, 0x0000 );

		R1000_WRITE_GMII_REG( (unsigned long)ioaddr, 0x0B, 0x0000 );

#endif

	}

	else{

		DBG_PRINT("priv->mcfg=%d. Discard hw PHY config.\n",priv->mcfg);

	}

}

static void r1000_hw_start (struct net_device *netdev)

{

	struct r1000_private *priv = netdev->priv;

	struct pci_dev *pdev = priv->pci_dev;

	unsigned long ioaddr = priv->ioaddr;

	u32 i;

	u8 i8;

	u16 i16;

	if((priv->mcfg!=MCFG_METHOD_5)&&(priv->mcfg!=MCFG_METHOD_11)&&

	   (priv->mcfg!=MCFG_METHOD_12)&&(priv->mcfg!=MCFG_METHOD_13)&&

	   (priv->mcfg!=MCFG_METHOD_14)&&(priv->mcfg!=MCFG_METHOD_15)){

		/* Soft reset the chip. */

		RTL_W8 ( ChipCmd, CmdReset);

		/* Check that the chip has finished the reset. */

		for (i = 1000; i > 0; i--){

			if ((RTL_R8( ChipCmd ) & CmdReset) == 0) break;

			else udelay (10);

		}

		RTL_W8 ( Cfg9346, Cfg9346_Unlock);

		RTL_W8 ( ChipCmd, CmdTxEnb | CmdRxEnb);

		RTL_W8 ( ETThReg, ETTh);

		// For gigabit rtl8169

		RTL_W16	( RxMaxSize, (unsigned short)priv->hw_rx_pkt_len );

		// Set Rx Config register

		i = r1000_rx_config | ( RTL_R32( RxConfig ) & rtl_chip_info[priv->chipset].RxConfigMask);

		RTL_W32 ( RxConfig, i);

		/* Set DMA burst size and Interframe Gap Time */

		RTL_W32 ( TxConfig, (TX_DMA_BURST << TxDMAShift) | (InterFrameGap << TxInterFrameGapShift) );

		RTL_W16( CPlusCmd, RTL_R16(CPlusCmd) );

		if(priv->mcfg==MCFG_METHOD_2||priv->mcfg==MCFG_METHOD_3){

			RTL_W16( CPlusCmd, (RTL_R16(CPlusCmd)|(1<<14)|(1<<3)) );

			DBG_PRINT("Set MAC Reg C+CR Offset 0xE0: bit-3 and bit-14\n");

		}else{

			RTL_W16( CPlusCmd, (RTL_R16(CPlusCmd)|(1<<3)) );

			DBG_PRINT("Set MAC Reg C+CR Offset 0xE0: bit-3.\n");

		}

		{

			RTL_W16(0xE2,0x0000);

		}

		priv->cur_rx = 0;

		RTL_W32 ( TxDescStartAddr, priv->txdesc_phy_dma_addr);

		RTL_W32 ( TxDescStartAddr + 4, 0x00);

		RTL_W32 ( RxDescStartAddr, priv->rxdesc_phy_dma_addr);

		RTL_W32 ( RxDescStartAddr + 4, 0x00);

		RTL_W8 ( Cfg9346, Cfg9346_Lock );

		udelay (10);

		RTL_W32 ( RxMissed, 0 );

		r1000_set_rx_mode(netdev);

		RTL_W16 ( MultiIntr, RTL_R16(MultiIntr) & 0xF000);

		RTL_W16 ( IntrMask, r1000_intr_mask);

	}else{

		/* Soft reset the chip. */

		RTL_W8 ( ChipCmd, CmdReset);

		/* Check that the chip has finished the reset. */

		for (i = 1000; i > 0; i--){

			if ((RTL_R8( ChipCmd ) & CmdReset) == 0) break;

			else udelay (10);

		}

		if( priv->mcfg == MCFG_METHOD_13 ){

			pci_write_config_word(pdev,0x68,0x00);

			pci_write_config_word(pdev,0x69,0x08);

		}

		if( priv->mcfg == MCFG_METHOD_5 ){

			i8=RTL_R8(Config2);

			i8=i8&0x07;

			if(i8&&0x01)

				RTL_W32(Off7Ch,0x0007FFFF);

			i=0x0007FF00;

			RTL_W32(Off7Ch, i);

			pci_read_config_word(pdev,0x04,&i16);

			i16=i16&0xEF;

			pci_write_config_word(pdev,0x04,i16);

		}

		RTL_W8 ( Cfg9346, Cfg9346_Unlock);

		RTL_W8 ( ETThReg, ETTh);

		// For gigabit rtl8169

		RTL_W16	( RxMaxSize, (unsigned short)priv->hw_rx_pkt_len );

		RTL_W16( CPlusCmd, RTL_R16(CPlusCmd) );

		if(priv->mcfg==MCFG_METHOD_2||priv->mcfg==MCFG_METHOD_3){

			RTL_W16( CPlusCmd, (RTL_R16(CPlusCmd)|(1<<14)|(1<<3)) );

			DBG_PRINT("Set MAC Reg C+CR Offset 0xE0: bit-3 and bit-14\n");

		}else{

			RTL_W16( CPlusCmd, (RTL_R16(CPlusCmd)|(1<<3)) );

			DBG_PRINT("Set MAC Reg C+CR Offset 0xE0: bit-3.\n");

		}

		{

			RTL_W16(0xE2,0x0000);

		}

		priv->cur_rx = 0;

		RTL_W32 ( TxDescStartAddr, priv->txdesc_phy_dma_addr);

		RTL_W32 ( TxDescStartAddr + 4, 0x00);

		RTL_W32 ( RxDescStartAddr, priv->rxdesc_phy_dma_addr);

		RTL_W32 ( RxDescStartAddr + 4, 0x00);

		RTL_W8 ( ChipCmd, CmdTxEnb | CmdRxEnb);

		// Set Rx Config register

		i = r1000_rx_config | ( RTL_R32( RxConfig ) & rtl_chip_info[priv->chipset].RxConfigMask);

		RTL_W32 ( RxConfig, i);

		/* Set DMA burst size and Interframe Gap Time */

		RTL_W32 ( TxConfig, (TX_DMA_BURST << TxDMAShift) | (InterFrameGap << TxInterFrameGapShift) );

		RTL_W8 ( Cfg9346, Cfg9346_Lock );

		udelay (10);

		RTL_W32 ( RxMissed, 0 );

		r1000_set_rx_mode(netdev);

		RTL_W16 ( MultiIntr, RTL_R16(MultiIntr) & 0xF000);

		RTL_W16 ( IntrMask, r1000_intr_mask);

	}

	netif_start_queue(netdev);

}//end of r1000_hw_start (struct net_device *netdev)

static void r1000_init_ring (struct net_device *netdev)

{

	struct r1000_private *priv = netdev->priv;

	struct pci_dev *pdev = priv->pci_dev;

	int i;

	struct sk_buff	*skb;

	priv->cur_rx = 0;

	priv->cur_tx = 0;

	priv->dirty_tx = 0;

	memset(priv->TxDescArray, 0x0, NUM_TX_DESC*sizeof(struct TxDesc));

	memset(priv->RxDescArray, 0x0, NUM_RX_DESC*sizeof(struct RxDesc));

	for (i=0 ; i<NUM_TX_DESC ; i++){

		priv->Tx_skbuff[i]=NULL;

		priv->txdesc_array_dma_addr[i] = pci_map_single(pdev, &priv->TxDescArray[i], sizeof(struct TxDesc), PCI_DMA_TODEVICE);

	}

	for (i=0; i <NUM_RX_DESC; i++) {

		if(i==(NUM_RX_DESC-1)){

			priv->RxDescArray[i].status = cpu_to_le32((OWNbit | EORbit) | (unsigned long)priv->hw_rx_pkt_len);

		}

		else{

			priv->RxDescArray[i].status = cpu_to_le32(OWNbit | (unsigned long)priv->hw_rx_pkt_len);

		}

		{//-----------------------------------------------------------------------

			skb = priv->Rx_skbuff[i];

			priv->rx_skbuff_dma_addr[i] = pci_map_single(pdev, skb->data, MAX_RX_SKBDATA_SIZE, PCI_DMA_FROMDEVICE);

			if( skb != NULL ){

				priv->RxDescArray[i].buf_addr = cpu_to_le32(priv->rx_skbuff_dma_addr[i]);

				priv->RxDescArray[i].buf_Haddr = 0;

			}

			else{

				DBG_PRINT("%s: %s() Rx_skbuff == NULL\n", netdev->name, __FUNCTION__);

				priv->drvinit_fail = 1;

			}

		}//-----------------------------------------------------------------------

		priv->rxdesc_array_dma_addr[i] = pci_map_single(pdev, &priv->RxDescArray[i], sizeof(struct RxDesc), PCI_DMA_TODEVICE);

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)

		pci_dma_sync_single(pdev, priv->rxdesc_array_dma_addr[i], sizeof(struct RxDesc), PCI_DMA_TODEVICE);

#endif

	}

}

static void r1000_tx_clear (struct r1000_private *priv)

{

	int i;

	priv->cur_tx = 0;

	for ( i = 0 ; i < NUM_TX_DESC ; i++ ){

		if ( priv->Tx_skbuff[i] != NULL ) {

			dev_kfree_skb ( priv->Tx_skbuff[i] );

			priv->Tx_skbuff[i] = NULL;

			priv->stats.tx_dropped++;

		}

	}

}

static void r1000_tx_timeout (struct net_device *netdev)

{

	struct r1000_private *priv = netdev->priv;

	unsigned long ioaddr = priv->ioaddr;

	u8 tmp8;

	/* disable Tx, if not already */

	tmp8 = RTL_R8( ChipCmd );

	if (tmp8 & CmdTxEnb){

		RTL_W8 ( ChipCmd, tmp8 & ~CmdTxEnb);

	}

	/* Disable interrupts by clearing the interrupt mask. */

	RTL_W16 ( IntrMask, 0x0000);

	/* Stop a shared interrupt from scavenging while we are. */

	spin_lock_irq (&priv->lock);

	r1000_tx_clear (priv);

	spin_unlock_irq (&priv->lock);

	r1000_hw_start(netdev);

	netif_wake_queue(netdev);

}

static int r1000_start_xmit (struct sk_buff *skb, struct net_device *netdev)

{

	struct r1000_private *priv = netdev->priv;

	unsigned long ioaddr = priv->ioaddr;

	struct pci_dev *pdev = priv->pci_dev;

	int entry = priv->cur_tx % NUM_TX_DESC;

	int buf_len = 60;

	dma_addr_t txbuf_dma_addr;

	spin_lock_irq (&priv->lock);

	if( (le32_to_cpu(priv->TxDescArray[entry].status) & OWNbit)==0 ){

		priv->Tx_skbuff[entry] = skb;

		txbuf_dma_addr = pci_map_single(pdev, skb->data, skb->len, PCI_DMA_TODEVICE);

		priv->TxDescArray[entry].buf_addr = cpu_to_le32(txbuf_dma_addr);

		DBG_PRINT("%s: TX pkt_size = %d\n", __FUNCTION__, skb->len);

		if( skb->len <= priv->tx_pkt_len ){

			buf_len = skb->len;

		}

		else{

			printk("%s: Error -- Tx packet size(%d) > mtu(%d)+14\n", netdev->name, skb->len, netdev->mtu);

			buf_len = priv->tx_pkt_len;

		}

		if( entry != (NUM_TX_DESC-1) ){

			priv->TxDescArray[entry].status = cpu_to_le32((OWNbit | FSbit | LSbit) | buf_len);

		}

		else{

			priv->TxDescArray[entry].status = cpu_to_le32((OWNbit | EORbit | FSbit | LSbit) | buf_len);

		}

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)

		pci_dma_sync_single(pdev, priv->txdesc_array_dma_addr[entry], sizeof(struct TxDesc), PCI_DMA_TODEVICE);

#endif

		RTL_W8 ( TxPoll, 0x40);		//set polling bit

		netdev->trans_start = jiffies;

		priv->stats.tx_bytes += ( (skb->len > ETH_ZLEN) ? skb->len : ETH_ZLEN);

		priv->cur_tx++;

	}//end of if( (priv->TxDescArray[entry].status & 0x80000000)==0 )

	spin_unlock_irq (&priv->lock);

	if ( (priv->cur_tx - NUM_TX_DESC) == priv->dirty_tx ){

		netif_stop_queue(netdev);

	}

	else{

		if (netif_queue_stopped(netdev)){

			netif_wake_queue(netdev);

		}

	}

	return 0;

}

static void r1000_tx_interrupt (struct net_device *netdev, struct r1000_private *priv, unsigned long ioaddr)

{

	unsigned long dirty_tx, tx_left=0;

	int entry = priv->cur_tx % NUM_TX_DESC;

    	int txloop_cnt = 0;

	assert (netdev != NULL);

	assert (priv != NULL);

	assert (ioaddr != NULL);

	dirty_tx = priv->dirty_tx;

	tx_left = priv->cur_tx - dirty_tx;

	while( (tx_left > 0) && (txloop_cnt < max_interrupt_work) ){

		if( (le32_to_cpu(priv->TxDescArray[entry].status) & OWNbit) == 0 ){

#ifdef R1000_DYNAMIC_CONTROL

			r1000_callback_tx(&(priv->rt), 1, priv->Tx_skbuff[dirty_tx % NUM_TX_DESC]->len);

#endif //end #ifdef R1000_DYNAMIC_CONTROL

			dev_kfree_skb_irq( priv->Tx_skbuff[dirty_tx % NUM_TX_DESC] );

			priv->Tx_skbuff[dirty_tx % NUM_TX_DESC] = NULL;

			priv->stats.tx_packets++;

			dirty_tx++;

			tx_left--;

			entry++;

		}

		txloop_cnt ++;

	}

	if (priv->dirty_tx != dirty_tx) {

		priv->dirty_tx = dirty_tx;

		if (netif_queue_stopped(netdev))

			netif_wake_queue(netdev);

	}

}

static void r1000_rx_interrupt (struct net_device *netdev, struct r1000_private *priv, unsigned long ioaddr)

{

	struct pci_dev *pdev = priv->pci_dev;

	int cur_rx;

	int pkt_size = 0 ;

	int rxdesc_cnt = 0;

	int ret;

	struct sk_buff *n_skb = NULL;

	struct sk_buff *cur_skb;

	struct sk_buff *rx_skb;

	struct	RxDesc	*rxdesc;

	assert(netdev != NULL);

	assert (priv != NULL);

	assert (ioaddr != NULL);

	cur_rx = priv->cur_rx;

	rxdesc = &priv->RxDescArray[cur_rx];

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)

	pci_dma_sync_single(pdev, priv->rxdesc_array_dma_addr[cur_rx], sizeof(struct RxDesc), PCI_DMA_FROMDEVICE);

#endif

	while ( ((le32_to_cpu(rxdesc->status) & OWNbit)== 0) && (rxdesc_cnt < max_interrupt_work) ){

	    rxdesc_cnt++;

	    if( le32_to_cpu(rxdesc->status) & RxRES ){

			printk(KERN_INFO "%s: Rx ERROR!!!\n", netdev->name);

			priv->stats.rx_errors++;

			if ( le32_to_cpu(rxdesc->status) & (RxRWT|RxRUNT) )

				priv->stats.rx_length_errors++;

			if ( le32_to_cpu(rxdesc->status) & RxCRC)

				priv->stats.rx_crc_errors++;

	    }

	    else{

			pkt_size=(int)(le32_to_cpu(rxdesc->status) & 0x00001FFF)-4;

			if( pkt_size > priv->rx_pkt_len ){

				printk("%s: Error -- Rx packet size(%d) > mtu(%d)+14\n", netdev->name, pkt_size, netdev->mtu);

				pkt_size = priv->rx_pkt_len;

			}

			DBG_PRINT("%s: RX pkt_size = %d\n", __FUNCTION__, pkt_size);

			{// -----------------------------------------------------

				rx_skb = priv->Rx_skbuff[cur_rx];

				n_skb = R1000_ALLOC_RXSKB(MAX_RX_SKBDATA_SIZE);

				if( n_skb != NULL ) {

					skb_reserve (n_skb, 8);	// 16 byte align the IP fields. //

					// Indicate rx_skb

					if( rx_skb != NULL ){

						rx_skb->dev = netdev;

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)

						pci_dma_sync_single(pdev, priv->rx_skbuff_dma_addr[cur_rx], sizeof(struct RxDesc), PCI_DMA_FROMDEVICE);

#endif

						skb_put ( rx_skb, pkt_size );

						rx_skb->protocol = eth_type_trans ( rx_skb, netdev );

						ret = R1000_NETIF_RX (rx_skb);

//						netdev->last_rx = jiffies;

						priv->stats.rx_bytes += pkt_size;

						priv->stats.rx_packets++;

#ifdef R1000_DYNAMIC_CONTROL

						r1000_callback_rx( &(priv->rt), 1, pkt_size);

#endif //end #ifdef R1000_DYNAMIC_CONTROL

					}//end if( rx_skb != NULL )

					priv->Rx_skbuff[cur_rx] = n_skb;

				}

				else{

					DBG_PRINT("%s: Allocate n_skb failed!\n",__FUNCTION__ );

					priv->Rx_skbuff[cur_rx] = rx_skb;

				}

				// Update rx descriptor

				if( cur_rx == (NUM_RX_DESC-1) ){

					priv->RxDescArray[cur_rx].status  = cpu_to_le32((OWNbit | EORbit) | (unsigned long)priv->hw_rx_pkt_len);

				}

				else{

					priv->RxDescArray[cur_rx].status  = cpu_to_le32(OWNbit | (unsigned long)priv->hw_rx_pkt_len);

				}

				cur_skb = priv->Rx_skbuff[cur_rx];

				if( cur_skb != NULL ){

					priv->rx_skbuff_dma_addr[cur_rx] = pci_map_single(pdev, cur_skb->data, MAX_RX_SKBDATA_SIZE, PCI_DMA_FROMDEVICE);

					rxdesc->buf_addr = cpu_to_le32(priv->rx_skbuff_dma_addr[cur_rx]);

				}

				else{

					DBG_PRINT("%s: %s() cur_skb == NULL\n", netdev->name, __FUNCTION__);

				}

			}//------------------------------------------------------------

	    }// end of if( priv->RxDescArray[cur_rx].status & RxRES )

	    cur_rx = (cur_rx +1) % NUM_RX_DESC;

	    rxdesc = &priv->RxDescArray[cur_rx];

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)

	    pci_dma_sync_single(pdev, priv->rxdesc_array_dma_addr[cur_rx], sizeof(struct RxDesc), PCI_DMA_FROMDEVICE);

#endif

	}// end of while ( (priv->RxDescArray[cur_rx].status & 0x80000000)== 0)

	if( rxdesc_cnt >= max_interrupt_work ){

		DBG_PRINT("%s: Too much work at Rx interrupt.\n", netdev->name);

	}

	priv->cur_rx = cur_rx;

}

/* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)

static void r1000_interrupt (int irq, void *dev_instance, struct pt_regs *regs)

#else

static irqreturn_t r1000_interrupt (int irq, void *dev_instance, struct pt_regs *regs)

#endif

{

	struct net_device *netdev = (struct net_device *) dev_instance;

	struct r1000_private *priv = netdev->priv;

	int boguscnt = max_interrupt_work;

	unsigned long ioaddr = priv->ioaddr;

	unsigned int status = 0;

//	irqreturn_int interrupt_handled = IRQ_NONE;

	int interrupt_handled = IRQ_NONE;

	unsigned int phy_status = 0;

	RTL_W16 ( IntrMask, 0x0000);

	do {

		status = RTL_R16(IntrStatus);

		if (status == 0xFFFF)

			break;

		RTL_W16( IntrStatus, status );

		if ( (status & r1000_intr_mask ) == 0 )

			break;

		else

			interrupt_handled = IRQ_HANDLED;

		// Rx interrupt

//		if (status & (RxOK | RxErr /* | LinkChg | RxOverflow | RxFIFOOver*/)){

			r1000_rx_interrupt(netdev, priv, ioaddr);

//		}

		// Tx interrupt

//		if (status & (TxOK | TxErr)) {

			spin_lock (&priv->lock);

			r1000_tx_interrupt(netdev, priv, ioaddr);

			spin_unlock (&priv->lock);

//		}

		if ((status&TxOK)&&(status&TxDescUnavail)) 

			RTL_W8(TxPoll,0x40);

		phy_status = RTL_R8(PHYstatus);

		if(((priv->mcfg==MCFG_METHOD_2)||(priv->mcfg==MCFG_METHOD_3))&&(phy_status&_100Mbps)){

			if(status&LinkChg){

				if(phy_status&LinkStatus){

					R1000_WRITE_GMII_REG((unsigned long)ioaddr,0x1f,0x0001);

					R1000_WRITE_GMII_REG((unsigned long)ioaddr,0x10,0xf01b);

					R1000_WRITE_GMII_REG((unsigned long)ioaddr,0x1f,0x0000);

				}else{

					R1000_WRITE_GMII_REG((unsigned long)ioaddr,0x1f,0x0001);

					R1000_WRITE_GMII_REG((unsigned long)ioaddr,0x10,0xf41b);

					R1000_WRITE_GMII_REG((unsigned long)ioaddr,0x1f,0x0000);

				}

			}

		}

		boguscnt--;

	} while (boguscnt > 0);

	if (boguscnt <= 0) {

		DBG_PRINT("%s: Too much work at interrupt!\n", netdev->name);

		RTL_W16( IntrStatus, 0xffff);	// Clear all interrupt sources

	}

	RTL_W16 ( IntrMask, r1000_intr_mask);

#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)

	return interrupt_handled;

#endif

}

static int r1000_close (struct net_device *netdev)

{

	struct r1000_private *priv = netdev->priv;

	unsigned long ioaddr = priv->ioaddr;

	int i;

	// -----------------------------------------

	r1000_delete_timer( &(priv->r1000_timer) );

	netif_stop_queue(netdev);

	spin_lock_irq (&priv->lock);

	/* Stop the chip's Tx and Rx processes. */

	RTL_W8 ( ChipCmd, 0x00);

	/* Disable interrupts by clearing the interrupt mask. */

	RTL_W16 ( IntrMask, 0x0000);

	/* Update the error counts. */

	priv->stats.rx_missed_errors += RTL_R32(RxMissed);

	RTL_W32( RxMissed, 0);

	spin_unlock_irq (&priv->lock);

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)

	synchronize_irq ();

#else

	synchronize_irq(entdev->irq);

#endif

	free_irq (netdev->irq, netdev);

	r1000_tx_clear (priv);

	//2004-05-11

	if(priv->txdesc_space != NULL){

		pci_free_consistent(

				priv->pci_dev,

				priv->sizeof_txdesc_space,

				priv->txdesc_space,

				priv->txdesc_phy_dma_addr

		);

		priv->txdesc_space = NULL;

	}

	if(priv->rxdesc_space != NULL){

		pci_free_consistent(

				priv->pci_dev,

				priv->sizeof_rxdesc_space,

				priv->rxdesc_space,

				priv->rxdesc_phy_dma_addr

		);

		priv->rxdesc_space = NULL;

	}

	priv->TxDescArray = NULL;

	priv->RxDescArray = NULL;

	{//-----------------------------------------------------------------------------

		for(i=0;i<NUM_RX_DESC;i++){

			if( priv->Rx_skbuff[i] != NULL ) {

				R1000_FREE_RXSKB ( priv->Rx_skbuff[i] );

			}

		}

	}//-----------------------------------------------------------------------------

	DBG_PRINT("%s: %s() alloc_rxskb_cnt = %d\n", netdev->name, __FUNCTION__, alloc_rxskb_cnt );

	return 0;

}

static unsigned const ethernet_polynomial = 0x04c11db7U;

static inline u32 ether_crc (int length, unsigned char *data)

{

	int crc = -1;

	while (--length >= 0) {

		unsigned char current_octet = *data++;

		int bit;

		for (bit = 0; bit < 8; bit++, current_octet >>= 1)

			crc = (crc << 1) ^ ((crc < 0) ^ (current_octet & 1) ? ethernet_polynomial : 0);

	}

	return crc;

}

static void r1000_set_rx_mode (struct net_device *netdev)

{

	struct r1000_private *priv = netdev->priv;

	unsigned long ioaddr = priv->ioaddr;

	unsigned long flags;

	u32 mc_filter[2];	/* Multicast hash filter */

	int i, rx_mode;

	u32 tmp=0;

	if (netdev->flags & IFF_PROMISC) {

		/* Unconditionally log net taps. */

		printk (KERN_NOTICE "%s: Promiscuous mode enabled.\n", netdev->name);

		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys | AcceptAllPhys;

		mc_filter[1] = mc_filter[0] = 0xffffffff;

	} else if ((netdev->mc_count > multicast_filter_limit) || (netdev->flags & IFF_ALLMULTI)) {

		/* Too many to filter perfectly -- accept all multicasts. */

		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;

		mc_filter[1] = mc_filter[0] = 0xffffffff;

	} else {

		struct dev_mc_list *mclist;

		rx_mode = AcceptBroadcast | AcceptMulticast | AcceptMyPhys;

		mc_filter[1] = mc_filter[0] = 0;

#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)

		for (i = 0, mclist = netdev->mc_list; mclist && i < netdev->mc_count; i++, mclist = mclist->next)

		{

			set_bit (ether_crc (ETH_ALEN, mclist->dmi_addr) >> 26, mc_filter);

		}			

#else

		for (i = 0, mclist = netdev->mc_list; mclist && i < netdev->mc_count; i++, mclist = mclist->next)

		{

			int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26;

			mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31);

			rx_mode |= AcceptMulticast;

----------

## man in the hill

Salut Babos,

Il y a une autre façon d'installer du  wifi sous Gnu/Linux quand il n'y a pas de drivers: c'est ndiswrapper que j'utilise d'ailleurs pour mon portable hp...

http://ndiswrapper.sourceforge.net/mediawiki/index.php/Main_Page

Tu vas voir la liste des cartes avec le chipset intel (la section I) et tu verras  ta carte ! ensuite l'installation est très facile...Pour ton autre soucis, je cherche quand je ne suis pas en plein bug   :Laughing:  .

[EDIT]Faut désinstaller et n'oublis de réactiver le support ieee...ds le kernel, et le wireless bien sur.[/EDIT]

                                                                @+

----------

## man in the hill

 *babos wrote:*   

> MODULE_PARM_DESC (media, "1-" __MODULE_STRING(MAX_UNITS) "i");

 

Cette ligne n'est pas identique au lien que je t'ai passé :

-1- Pas de tiret à côté du 1 !

-2-  Un espace entre MODULE_STRING et MAX... !

Essais de migrer vers le noyau 2.6.17 et ré-essais une installe...

                                                                 @+

----------

## man in the hill

Salut,

Alors , le problème est résolu   :Smile:   ?

                                                                               @+

----------

## babos

Désolé, Man in the Hill, je suis parti en vacance pour l'instant, merci beaucoup pour l'aide, dès que je rentre, je te donne des nouvelles.

A plus!

----------

## man in the hill

Bonnes  Vacances   :Cool:   :Laughing: 

                                                            @+

----------

## babos

Yeeeepee!!

Ca y est, merci Man in the Hill et encore désolé pour le temps de réponse, mais avec la reprise du boulot et les différentes mises à jour de mon système, j'avoue que je ne m'étais pas repenché sur le problème. 

Bon, alors pour la wifi, le ipw3945 en instable avec sa version 1.1.0-r1 a fini par éliminer ce problème de démarrage en alternance.

J'ai bien cherché du côté du ndiswrapper, mais impossible de trouver dans mes CD les fichier .sys et .inf. Je n'ai qu'un fichier .exe

Mais bon, puisque maintenant le pilote fonctionne correctement.

Alors après le r1000. Super, merci Man in the Hill, j'ai relu le post du lien que tu m'avais filé et j'ai modifié le dernier pilote de Realtruc en conséquence. J'ai du aussi modifier le Makefile pour qu'il trouve le bon chemin.

Bon, après avoir finalement créé un lien symbolique net.eth1 vers net.lo, mes deux interfaces fonctionnent. Je vais quand même relire la doc pour vérifier la conf du double système.

Ah oui, j'ai juste un dernier petit problème, j'ai l'impression que lorsque l'ordi tourne sur la batterie, le modem wifi se désactive au bout d'un moment et je n'arrive pas à le relancer. Mais je vais vérifier quand même que c'est bien ça. En tout cas merci beaucoup à toute la communauté et un spécial clin d'oeil pour Man in the Hill.

Bien, maintenant je vais essayer de faire un petit wiki pour résumer tout ça.

Merci encore!  :Razz: 

----------

## babos

Bon, un petit lien pour rediriger le sujet ipw3945 car tout est là :

https://forums.gentoo.org/viewtopic-t-434817-postdays-0-postorder-asc-highlight-ipw3945+wireless+drivers-start-0.html

le wiki ipw3945:

http://gentoo-wiki.com/HARDWARE_ipw3945

Voilà, j'ai toujours des problèmes mais je ne suis plus oé de redémarrer, j'utilise les scripts du premier sujet. En espérant que tout cela finisse par se stabiliser.

En tous cas, merci Man in the Hill et les autres gentooïstes

----------

