การคอมไพล์ driver wireless Broadcom-wl บน linux kernel 3.10+

กระทู้สนทนา
ผมเขียน กระทู้นี้เพราะคาดว่าน่าจะมีคนเจอปัญหาเดียวกับผมอยู่อีกมาก เผื่อๆ จะ search google มาเจอ
ทำไมคุณจึงต้องการไดร์เวอร์ตัวนี้
เพราะว่า
1. มีซิบเซตบางตัวที่ ไดร์เวอร์ open source ไม่สนับสนุน ดูได้ ที่นี่ http://wireless.kernel.org/en/users/Drivers/b43
2. ใน kernel (3.8,3.10] มีบัครีเกรสชันสำหรับ wireless บางตัว ทำให้ไม่สามารถใช้งานได้ในบางกรณีและเกิด kernel panic
3. คุณต้องการที่จะปรับปรุงคุณภาพการับสัญญาณให้ดีขึ้น เพราะ Broadcom-wl ทำให้ wireless ของคุณรับสัญญาณได้ดีขึ้นอย่างมาก

ทำไมคุณจึงไม่ควรใช้ driver ตัวนี้
1 . มัน open source ก็จริงครับแต่มันไม่ใช่ GPL หมายความว่ามันไม่ติดตั้งมาใน kernel เป็นเีฟอล์ และ ไม่มี Distro ใหน สนับสนุนมันอย่างเป็นทางการ
2. เนื่องจากมันเป็น proprietary คุณต้องติดตั้ง module ใหม่ทุกครั้งที่อัพเดท kernel

มาเริ่มกันเลยดีกว่าครับ
เครื่องมือที่ต้องมี หามาติดตั้งให้ครบก่อนนะครับ
gcc patch diff make linux-header depmod

โหลด Source code จากที่นี่
http://www.broadcom.com/support/802.11/linux_sta.php

สั่ง
make
make install

ถ้าคุณผ่าน ยินดีด้วยครับ ข้ามไปขั้นตอนสุดท้ายและคุณควรจะอัพเกรดเครื่องคุณได้แล้ว แต่ถ้าไม่ผ่านขอให้ทำดังนี้ครับ

1. เนื่องจากผมได้ลองไล่ source code ของไดร์เวอร์ตัวนี้แล้วพบว่า  มันสนับสนุนแค่ kernel 2.6+ ซึ่งแปลกประหลาดมาก
ซึ่งการที่สนับสนุนแค่ kernel รุ่นเก่า หมายความว่าเครื่องคุณจะไช้ไม่ได้เพราะ API linux เปลี่ยนบ่อยๆ
ให้คุณโหลด patch file จากที่นี่ และ patch ในไฟล์ wl_linux.c ให้เรียบร้อย
https://gist.github.com/chunyang/6274925
ใครที่ใช้โปรแกรม patch ไม่เป็นก็หัดเสียนะครับ

2. ถ้าคุณพบ error ว่า ไม่พบไฟล์ #include <asm/system.h>
ปัญหานี้เกิดจากตั้งแต่ kernel 3.8+ ได้แทนไฟล์นี้ด้วยไฟล์ย่อยๆ อื่นๆ จำนวนหนึ่ง ให้คุณลบบรรทัดนี้ทิ้งได้เลย
(Why ? คุณลองไปไล่โค้ดเทียบกับ The Linux Kernel Module Programming Guide ดูครับ)

3. หากคุณพบ error เกี่ยวกับ ไม่พบ .ndo_set_multicast_list


.ndo_set_multicast_list = wl_set_multicast_list,


ตรงนี้เท่าที่ผมดูเป็นการ set ค่า ABI ซึ่งจะมีปัญหาถ้าคุณใช้ระบบ 64bit ซึ่งมีการเปลียน ABI
ให้แก้เป็น

ndo_set_rx_mode = wl_set_multicast_list,


http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=656600


หลังจากนั้นก็
make
make install

แล้วก็สั่ง blacklist ไดร์เวอร์ตัวเก่า (สร้างไฟล์ .conf ขึ้นมาใน /etc/modprobe.d) เช่น b43 bcma
หลังจากนั้นจึงสั่ง
หลังจากนั้นก็ restart เครื่อง

แล้วสั่ง
modprobe wl
หรือ
depmod

ทดสอบบน arch Linux และ mint น่าจะทำงานได้บน gentoo เช่นกัน


ป.ล. การลงไดร์เวอร์เดี๋ยวนี้ง่ายครับ เมื่อ 10+ ปีก่อนผมเคยคอมไพล์ driver modem ADSL จำได้เสียเวลาเป็นอาทิตย์เลยกว่าจะเล่นเน็ตได้ linux ที่ไม่มีระบบจัดการ packages นี่มันนรกชัดๆ เลย
แก้ไขข้อความเมื่อ
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่