tl;dr:
- Bàn phím và chuột không hoạt động với một số nhân nhất định.
- Không yêu cầu một cách giải quyết, tôi đã có điều đó.
- sử dụng
chia đôi git
, tôi đã xác định chính xác cam kết trong kho lưu trữ nhân Ubuntu nơi các thiết bị đầu vào của tôi ngừng hoạt động.
- Tôi phải làm gì tiếp theo, với điều kiện là sự cố không xảy ra trong các nhân ngược dòng gần đây hơn?
Thiết bị đầu vào USB của tôi:
- Bàn phím có dây Logitech G19
- Chuột có dây Logitech G502
- Bàn phím Sharkoon (rất cơ bản, không có đèn bàn phím, không có màn hình, không có nút phụ đặc biệt)
Phiên bản Ubuntu: 21.10
Chức năng bình thường (dự kiến):
- Trong Grub:
- Đèn bàn phím và chuột là trên
- Đèn LED NumLock tắt và bật khi tôi nhấn phím NumLock nhiều lần
- Bàn phím hoạt động (Tôi có thể sử dụng các phím mũi tên trong menu Grub)
- Trong màn hình đăng nhập Gnome:
- Đèn bàn phím và chuột là trên
- Đèn LED NumLock tắt và bật khi tôi nhấn phím NumLock nhiều lần
- Con trỏ chuột trên màn hình di chuyển khi tôi di chuyển chuột
- Đánh máy hoạt động (tôi có thể nhập mật khẩu của mình trong màn hình đăng nhập)
Khi nó không hoạt động:
- Trong Grub:
- Đèn bàn phím và chuột là trên
- Đèn LED NumLock tắt và bật khi tôi nhấn phím NumLock nhiều lần
- Bàn phím hoạt động (Tôi có thể sử dụng các phím mũi tên trong menu Grub)
- Trong màn hình đăng nhập Gnome:
- Đèn bàn phím và chuột là tắt
- Đèn LED NumLock tắt và tắt khi tôi nhấn phím NumLock nhiều lần
- Con trỏ chuột trên màn hình không di chuyển khi tôi di chuyển chuột
- Gõ không hoạt động
Với những điều trên, tôi có một kịch bản rất chắc chắn để kiểm tra xem một kernel nào đó có phù hợp với tôi hay không. Tôi đã cài đặt nhiều kernel khác nhau với 3 phương pháp:
- sử dụng
đúng cách
-> Nhân Ubuntu, có sẵn từ repo Ubuntu
- Sử dụng Trình cài đặt hạt nhân chính của Ubuntu -> kernel được biên dịch sẵn từ kernel.org.
- Sử dụng nhân Ubuntu tôi tự biên dịch từ git://kernel.ubuntu.com/ubuntu/ubuntu-impish.git. tôi đã sử dụng
chia đôi git
để kiểm tra các cam kết khác nhau và sau đó xây dựng từng cam kết đó, để tôi có thể tìm thấy cam kết chính xác nơi bàn phím và chuột ngừng hoạt động.
- Hạt nhân làm việc, đã thử nghiệm:
- 5.13.0-051300-chung (UKMI)
- 5.13.0-19-chung (apt)
- 5.13.0-20-chung (apt)
- 5.13.0-21-chung (apt)
- 5.13.0-22-chung (apt)
- Ubuntu-5.13.0-22.22-0-g3ab15e228151 (đã biên dịch)
- Ubuntu-5.13.0-22.22-317-g398351230dab (đã biên dịch)
- Ubuntu-5.13.0-22.22-356-g8ac4e2604dae (đã biên dịch)
- Ubuntu-5.13.0-22.22-376-gfab6fb5e61e1 (đã biên dịch)
- Ubuntu-5.13.0-22.22-386-gce5ff9b36bc3 (đã biên dịch)
- 5.16.11-051611-chung (UMKI)
- Hạt nhân bị lỗi, đã kiểm tra:
- Ubuntu-5.13.0-22.22-387-g0fc979747dec (đã biên dịch)
- Ubuntu-5.13.0-22.22-388-gab2802ea6621 (đã biên dịch)
- Ubuntu-5.13.0-22.22-391-ge24e59fa409c (đã biên dịch)
- Ubuntu-5.13.0-22.22-396-gc3d35f3acc3a (đã biên dịch)
- Ubuntu-5.13.0-22.22-475-g79b62d0bba89 (đã biên dịch)
- Ubuntu-5.13.0-23.23-0-gb188ba567fc9 (đã biên dịch)
- 5.13.0-23-chung (apt)
- 5.13.0-25-chung (apt)
- 5.13.0-27-chung (apt)
- 5.13.0-28-chung (apt)
- 5.13.0-30-chung (apt)
Kernel 5.13.0-22 là kernel Ubuntu mới nhất được cung cấp qua đúng cách
phù hợp với tôi, vì vậy tôi đã ghim phiên bản đó để ngăn nó tự động nâng cấp.Làm thế nào tôi đã làm điều đó một cách chính xác, nằm ngoài phạm vi câu hỏi của tôi.
5.13.0-23 là nhân Ubuntu đầu tiên phá vỡ bàn phím và chuột đối với tôi, vì vậy tôi biết rằng cam kết phá vỡ nó, phải ở đâu đó trong khoảng từ 5.13.0-22 đến 5.13.0-23. tôi đã sử dụng chia đôi git
để xác định cam kết chính xác và tôi đã tìm thấy nó. Điều này có nghĩa là chạy chia đôi git
, biên dịch & cài đặt kernel, khởi động lại, kiểm tra xem thiết bị đầu vào có hoạt động không, rồi thực hiện git chia đôi tốt
hoặc git chia đôi xấu
, theo kết quả kiểm tra. Mỗi phần tổng hợp mất khoảng 22 phút, vì vậy bạn có thể tưởng tượng rằng tôi đã mất khá nhiều thời gian!
Cam kết chính xác nơi thiết bị đầu vào của tôi ngừng hoạt động là Ubuntu-5.13.0-22.22-387-g0fc979747dec
. Nó chứa thay đổi này:
xhci: Khắc phục tham nhũng con trỏ vòng lệnh trong khi hủy bỏ lệnh
Liên kết lỗi: https://bugs.launchpad.net/bugs/1951880
cam kết ngược dòng ff0e50d3564f33b7f4b35cadeabd951d66cfc570.
Con trỏ vòng lệnh nằm ở bit [6:63] của lệnh
thanh ghi điều khiển vòng (CRCR). Tất cả các bit điều khiển như dừng lệnh,
hủy bỏ được đặt tại các bit [0:3]. Trong khi hủy bỏ một lệnh, chúng tôi đọc
CRCR và đặt bit hủy bỏ và ghi vào CRCR. Việc đọc sẽ luôn luôn
cung cấp cho con trỏ vòng lệnh là tất cả số không. Vì vậy, về cơ bản chúng tôi chỉ viết
các bit điều khiển. Vì chúng tôi chia phần ghi 64 bit thành hai phần ghi 32 bit,
có khả năng vòng lệnh xHC dừng trước cấp trên
dword (tất cả các số không) được viết. Nếu điều đó xảy ra, xHC cập nhật phần trên
dword của con trỏ vòng lệnh bên trong của nó với tất cả các số không. Lần tới,
khi vòng lệnh được khởi động lại, chúng tôi thấy lỗi truy cập bộ nhớ xHC.
Khắc phục sự cố này bằng cách chỉ ghi vào từ khóa thấp hơn của CRCR trong đó tất cả
các bit điều khiển được định vị.
ĐC: [email protected]
Người ký tắt: Pavankumar Kondeti <[email protected]>
Người ký tắt: Mathias Nyman <[email protected]>
Liên kết: https://lore.kernel.org/r/[email protected]
Người ký tắt: Greg Kroah-Hartman <[email protected]>
Người ký tắt: Kamal Mostafa <[email protected]>
Người ký tắt: Stefan Bader <[email protected]>
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
chỉ số 5b54a36..5a96f3e 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -366,16 +366,22 @@ khoảng trống tĩnh xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci,
/* Phải được gọi với xhci->lock holded, Releases and aquires lock back */
int tĩnh xhci_abort_cmd_ring(struct xhci_hcd *xhci, cờ dài không dấu)
{
- u64 tạm thời_64;
+ u32 temp_32;
int ret;
xhci_dbg(xhci, "Hủy vòng lệnh\n");
reinit_completion(&xhci->cmd_ring_stop_completion);
- temp_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring);
- xhci_write_64(xhci, temp_64 | CMD_RING_ABORT,
- &xhci->op_regs->cmd_ring);
+ /*
+ * Các bit điều khiển như dừng lệnh, hủy lệnh được đặt ở phía dưới
+ * dword của thanh ghi điều khiển vòng lệnh. Hạn chế viết
+ * vào từ dưới để tránh làm hỏng con trỏ vòng lệnh
+ * trường hợp lệnh đổ chuông dừng trước thời gian trên dword
+ * được viết.
+ */
+ temp_32 = readl(&xhci->op_regs->cmd_ring);
+ writel(temp_32 | CMD_RING_ABORT, &xhci->op_regs->cmd_ring);
/* Mục 4.6.1.2 của thông số kỹ thuật xHCI 1.0 cho biết phần mềm cũng nên đặt thời gian cho
* hoàn thành thao tác Hủy lệnh. Nếu CRR không bị phủ định trong 5
liên kết lỗi bảng khởi chạy không mang lại bất cứ điều gì hữu ích, bởi vì nó không chỉ cụ thể về thay đổi này.
liên kết chuỗi email giữa Mathias Nyman, Pavan Kondeti và youling257 là về sự thay đổi này, tuy nhiên cuộc trò chuyện cứ lướt qua đầu tôi.
Mathias Nyman đã cập nhật bản vá của mình. Thay đổi ban đầu của anh ấy (có lỗi) đã có trong nhân Ubuntu, bản vá mà anh ấy đã sửa nó thì không. Bản vá từ Mathias Nyman nằm trong nhân chính như v5.16-rc3-1-g09f736aa9547
, có nghĩa là nó được bao gồm trong 5.16
hạt nhân tuyến chính. Dựa theo https://kernel.ubuntu.com/, phiên bản Ubuntu tiếp theo, Jammy Jellyfish / 22.04 LTS, sẽ dựa trên phiên bản ngược dòng 5.15
kernel, mà tôi cho rằng có nghĩa là Ubuntu 22.04 LTS vẫn sẽ có bàn phím và chuột bị hỏng đối với tôi, trừ khi bản vá của Mathias Nyman được thêm vào nhân Ubuntu.
Tôi đã hỏi trên #ubuntu-kernel Kênh IRC, nhưng có thể tôi đã hỏi vào thời điểm không có nhiều người trực tuyến để xem câu hỏi của tôi. Hoặc có thể kênh đó không hoạt động nhiều, nếu tôi xem các tệp nhật ký.
Tôi đã báo cáo một lỗi trên Launchpad: https://bugs.launchpad.net/ubuntu/+source/linux/+orms/1963555
Tôi có thể/nên làm gì khác không?