Lenovo ideapad-330C Ubuntu 18.04에 Realtek 8821CE 무선 카드 드라이브 설치

7875 단어
새로 산 Lenovoideapad-330C 노트북에 Ubuntu 18.04를 설치한 후, 무선 네트워크가 없다는 것을 슬프게 발견하였는데, 다행히 유선이 아직 쓸 수 있다는 것을 알게 되었다. 그리고 인터넷을 뒤져보니 많은 사람들이 이런 문제에 부딪혔고, 해결 방안도 제시하는 사람이 있었다.
참조 링크: Thinkpad E470C(내장형 NIC rlt8111/8618/8411 시리즈) 무선 NIC rtl8821CE 시리즈 설치 ubuntu와 win10 쌍 시스템에 무선 네트워크 문제가 없음(삭제)
상기 링크에서 해결 방안과 무선랜카드 rtl8821ce 원본 압축 패키지의 다운로드 주소를 제시하였으며, 필요한 경우 스스로 다운로드하십시오.
 
시스템: Ubuntu 18.04.2
커널:linux4.18
NIC: Realtek 8821CE Wireless LAN 802.11ac PCI-E NIC
참고 링크 방법에 따라 네트워크 카드 드라이브를 성공적으로 설치하여 이 컴퓨터에서 다시 시작하지 않아도 와이파이를 연결할 수 있었으나 나중에 시스템이 업데이트되었다...Ubuntu18.04.3, 커널이 linux 5로 업데이트되었습니다.0.0.31에서 재부팅 후 무선 카드 드라이버가 없음
현재 시스템: Ubuntu 18.04.3
커널:linux 5.0.0.31
어쩔 수 없이 원래의 방법에 따라 다시 한 번 했는데, 컴파일링이 잘못되었음을 발견했고, 설정이 바뀌지 않았으며,make는 다음과 같은 오류가 발생했다
rtl8821ce/os_dep/linux/os_intfs.c:1325:22: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
  .ndo_select_queue = rtw_select_queue,

이 오류를 보니 무슨 일이 일어났는지 모르겠다. 인터넷에서 찾아볼 수밖에 없다. 어떤 사람이 유형이 일치하지 않는다고 해서 내부 원본 코드에서 ndo 를 찾았다select_queue의 성명, 찾았습니다. 그렇습니다.
u16            (*ndo_select_queue)(struct net_device *dev,
                            struct sk_buff *skb,
                            struct net_device *sb_dev,
                            select_queue_fallback_t fallback);

네트워크 카드의 코드 rtl8821ce/osdep/linux/os_intfs.c:1192는 이렇습니다.
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
    , void *accel_priv
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
    , select_queue_fallback_t fallback
    #endif
#endif

 
이렇게 하면 네트워크 카드가 구동하는 원본 코드만 수정할 수 있습니다. 적당한 linux5로 변경합니다.0 이상 핵의 경우 다음 코드로 변경하고 핵에 대한 linux5를 추가합니다.0.0이상의 판단
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
    , struct net_device *sb_dev
    , select_queue_fallback_t fallback
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
    , void *accel_priv
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
    , select_queue_fallback_t fallback
    #endif
#endif

저장으로 변경, 계속make, 오류 보고
rtl8821ce/os_dep/linux/rtw_android.c:629:62: error: macro "access_ok" passed 3 arguments, but takes just 2
  if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {
                                                              ^
rtl8821ce/os_dep/linux/rtw_android.c:629:7: error: ‘access_ok’ undeclared (first use in this function)
  if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {

방법은 동일합니다. 계속accessok 커널 헤더 파일의 성명은 linux 5에서 발견되었습니다.0 이상accessok의 매개 변수는 2개이고 네트워크 카드 드라이브에 사용할 때 3개의 매개 변수가 있습니다
NIC 드라이버 소스 수동 수정, 파일: rtl8821ce/osdep/linux/rtw_android.c:629, 수정 후 다음과 같습니다: (원래 if(!access ok(VERIFY READ, priv cmd.buf, priv cmd.total len) {이 줄 코드 삭제, 아래 코드 추가)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
    if (!access_ok(priv_cmd.buf, priv_cmd.total_len)) {
#else
    if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {
#endif

저장, 계속make, 그리고 오류 보고:
rtl8821ce/os_dep/linux/ioctl_cfg80211.c: In function ‘rtw_get_systime_us’:
rtl8821ce/os_dep/linux/ioctl_cfg80211.c:339:2: error: implicit declaration of function ‘get_monotonic_boottime’; did you mean ‘getboottime’? [-Werror=implicit-function-declaration]
  get_monotonic_boottime(&ts);
  ^~~~~~~~~~~~~~~~~~~~~~
  getboottime

여기는 이미 수정된 힌트를 주었지만, 같은 방법으로는 get 를 찾을 수 없습니다monotonic_boottime 이 함수, 힌트를 찾을 수 있는 getboottime 함수는 다음과 같습니다. 단, 내부 핵이 5.0보다 낮은 버전을 고려하면 판단을 추가합니다.
rtl8821ce/os 삭제dep/linux/ioctl_cfg80211.c:339 이 줄 코드, 다음 코드 추가
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
        getboottime(&ts);
    #else
        get_monotonic_boottime(&ts);
    #endif

이번 make 드디어 성공했어!
make
sudo make install
sudo modprobe -a 8821ce

이 컴퓨터는 재부팅하지 않고 바로 원래의 와이파이와 연결된다
며칠 지나지 않아 컴퓨터가 또 업데이트되었는데, 재부팅한 후에 또 무선랜카드 구동이 없는 것을 발견하였다. 한번 보았는데, 원래 내부 핵이 또 업그레이드되었는데, 이번에는 다음과 같다.
시스템: Ubuntu 18.04.3
커널: Linux 5.0.0.32
내부 핵의 작은 변동이 모두 원래의 네트워크 카드 구동을 없앴다. 다행히 지난번의 네트워크 카드 구동 원본 코드의 변동은 아직 남아 있다. 아래의 조작을 반복한다.
make
sudo make install
sudo modprobe -a 8821ce

하하, 또 됐다.

좋은 웹페이지 즐겨찾기