From patchwork Mon Apr 15 10:46:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13629777 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC22F40875; Mon, 15 Apr 2024 10:47:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178042; cv=none; b=phH4hTI8N8KVuTvJTdSNZbd0y70mL1spwNP3fKxHoxwa5nyql8YIVLKsG3sTEO6mlczyZE7fyjuwrMTsLT78AONOkQIhCoFJOJ0Xa+WbW4+xKJBP/ybs6luj2iEChqDhnoc7BS83hR68CClV6SGPv2S8iHkHt+686LB24U1GRpA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178042; c=relaxed/simple; bh=nD1tEtqg4j7krrkyj/awg+O23r5SRZZiEXAq11MeqdI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TlqL+m4f5TijKQXMbabxiGDY3AN5xwzmypt4DjeiAxjgnmTwnh3I4RVHvklSKZNgMFyFzS8U00GVhtcjqZsMJc59WwmOOSpRPo9f7CWkJMgQ/jt7q6cVJxnZ5xHVYSbD+PGb1RyhjgHtusBYueMaFqch3x4jMJos4lC7jVkCC/U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gejsSo/v; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gejsSo/v" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-1e2a1654e6cso6694035ad.1; Mon, 15 Apr 2024 03:47:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713178039; x=1713782839; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8o93WmUwILj9Ylyz0cHUrPbesxHIpYDmgZJzB+S+Les=; b=gejsSo/vNrSqyBXN49/jBH4yaaZUaiABtxoNtsSirXkfA56XEp/W8T+1DMab5WsDCt uP5JLNBasdAtEz1yT68fo+6kyl4uNMcbSq0/QuxNNRrY5k8vw9x2+0hGSQiqsgx5WvVl X7uT6kIWwjYfaPU8Hz/8XqMJGlVg2P1RyQQpQFI7koLSpr4vPRbVRynJHNcQ82FrA3Qf 9oqq0YcK0V/cHEcO/OEpZyAKZ7vXDTf5FbyBJfkdBYYxvazoNXgt/gZlZkrdQA1tJbYN l5pgwBQrU+TJ4AjbL0bPDAmyDdFJMHh/U+6v4330Y7JEadEUtJq8DoYF452yX/yvv13y 54RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713178039; x=1713782839; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8o93WmUwILj9Ylyz0cHUrPbesxHIpYDmgZJzB+S+Les=; b=fuI1MjIbuZ0AREfM6P/SyS5L3TGA6zGTlYp4qZs/Gvx7W7ma6MF2R6eyfYvAZ3gGz3 7P4jvIcIu0BAT5ec53uEyneHtR+lLrLhXzu5NhCkMy5JRUL8h2VewdiOszXNYHAdMRtk IO+IjBEpgdMkN6unJFCqFXhO+zFf9psM/5Haa1rHCv+ZypQ+CWodFf97uAW4bHR8v+iU ph4b6bQ9jkZjX9Asxp7ccsId909cX+CI1eTmgwAP3J0/oRFsWH8o98oS74ls540TMBL4 f8lvZuAY4DP/ZG9Df6spb9SMunl0idPu2lkiF0uW5LpX5C81gBA3rZ1U15Dk29cCs4VB t+2A== X-Forwarded-Encrypted: i=1; AJvYcCWjA1ERXp//5r7dU356aaNmg70MuJVlLCDhzagNlrXKiWx8dXyolZszc6wUEb9I+DDZe+zNqXEMVFSu3bjkKvH9bY5rAdIJTsXJb+tJllo= X-Gm-Message-State: AOJu0YzUV2onTD7WTMCd7HRWS1kMcjtr/mZjrXajXkMfXhsaVLTBHl4A SZh2LNV4iAqwp+A2LxSNxVAYAG98c/5oDKVvLJymE5bGACxh2/sTx9K8JQ== X-Google-Smtp-Source: AGHT+IF2HHNmxBM0EgCJxntqHrJuV/y+/K00HLr6hdlIoL7wXYBCGXaX2KyRVAboFE6fhOynpp0Dew== X-Received: by 2002:a17:902:ce86:b0:1e5:1138:e28e with SMTP id f6-20020a170902ce8600b001e51138e28emr12017943plg.3.1713178039055; Mon, 15 Apr 2024 03:47:19 -0700 (PDT) Received: from rpi.. (p5315239-ipxg23901hodogaya.kanagawa.ocn.ne.jp. [180.34.87.239]) by smtp.gmail.com with ESMTPSA id d7-20020a170902654700b001e20afa1038sm7807806pln.8.2024.04.15.03.47.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Apr 2024 03:47:18 -0700 (PDT) From: FUJITA Tomonori To: netdev@vger.kernel.org Cc: andrew@lunn.ch, rust-for-linux@vger.kernel.org, tmgross@umich.edu Subject: [PATCH net-next v1 1/4] rust: net::phy support config_init driver callback Date: Mon, 15 Apr 2024 19:46:58 +0900 Message-Id: <20240415104701.4772-2-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415104701.4772-1-fujita.tomonori@gmail.com> References: <20240415104701.4772-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch adds phy_driver's config_init callback support for initializing the hardware. Signed-off-by: FUJITA Tomonori --- rust/kernel/net/phy.rs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs index 96e09c6e8530..44b59bbf1a52 100644 --- a/rust/kernel/net/phy.rs +++ b/rust/kernel/net/phy.rs @@ -338,6 +338,22 @@ impl Adapter { }) } + /// # Safety + /// + /// `phydev` must be passed by the corresponding callback in `phy_driver`. + unsafe extern "C" fn config_init_callback( + phydev: *mut bindings::phy_device, + ) -> core::ffi::c_int { + from_result(|| { + // SAFETY: This callback is called only in contexts + // where we hold `phy_device->lock`, so the accessors on + // `Device` are okay to call. + let dev = unsafe { Device::from_raw(phydev) }; + T::config_init(dev)?; + Ok(0) + }) + } + /// # Safety /// /// `phydev` must be passed by the corresponding callback in `phy_driver`. @@ -511,6 +527,11 @@ pub const fn create_phy_driver() -> DriverVTable { } else { None }, + config_init: if T::HAS_CONFIG_INIT { + Some(Adapter::::config_init_callback) + } else { + None + }, get_features: if T::HAS_GET_FEATURES { Some(Adapter::::get_features_callback) } else { @@ -583,6 +604,11 @@ fn soft_reset(_dev: &mut Device) -> Result { kernel::build_error(VTABLE_DEFAULT_ERROR) } + /// Initializes the hardware, including after a reset. + fn config_init(_dev: &mut Device) -> Result { + kernel::build_error(VTABLE_DEFAULT_ERROR) + } + /// Probes the hardware to determine what abilities it has. fn get_features(_dev: &mut Device) -> Result { kernel::build_error(VTABLE_DEFAULT_ERROR) From patchwork Mon Apr 15 10:46:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13629778 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E3F257876; Mon, 15 Apr 2024 10:47:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178042; cv=none; b=HhN55jSZXSFrXBcVHSNxJW99SHSo9TAruDx56Mkv+xMCMFfUh0ucfx4UmXV6sNRX0p7HjuJEGNHf7lermvpQbJJ7M+cwHM6eHJvsuDP237ZG89vHTCmI3XjQTLRFRx3KOmNxvCzSVOKv6/w1tWRZGQD8+vtR+51yYidVWIlycQM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178042; c=relaxed/simple; bh=mDsXOZiRjBw17WiyCt9RDsjjUz9yPKgL0seYrVNux60=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=mMvzHEidfJlE8m5B52sBksqYCljA44UVobl7IJ1f7kXQ4tTVnWmUJ4tC6pe8Mq8JmMp+N/G+VDSYzHi48fl+dxrMlsu3CHPzlawbZAel+FeMJGddCKm/iMq4x4RVENn3Gz6rQadHJ38P/Y+mVAKvzzNWohkWzARSYkbQIHYXH9o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JdYAs6DU; arc=none smtp.client-ip=209.85.214.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JdYAs6DU" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1e7af7eb4ccso61435ad.1; Mon, 15 Apr 2024 03:47:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713178041; x=1713782841; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BI+7QAyl9KHMPPW/ptNsMI2gC+m8PWYq6f/+7tSOvtw=; b=JdYAs6DUCDPD3J7yw+Vl3h++sBxNMluxIs9rbEgEw57GWQ8s1QszAeecy4rVnkcNI3 hHZ+Bxjo7RnUoy9rbzlloq9UJJKVd/aupZ9ld7kDmXw43bP7qacDeRc2KzWjUBmxBrIs L9Pci5vf/CdPze1OJn26odduN4q/rqrcFYpX0TqPDWWXPppA8QQkDzio+RFI7XwVcW3x T6wHHA587zFYWtMJjQeohAPa+/RljeeD1VAbWcqS+x2xLvK6zg566w4njwe4fUGx/5jV de9Bfr5UY5BQm6abi+o/ScBqmwJQtg35zfruZ4I2Btmv/vVzB/bm6g5gKu/aNYKfOS6r ylVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713178041; x=1713782841; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BI+7QAyl9KHMPPW/ptNsMI2gC+m8PWYq6f/+7tSOvtw=; b=uZtlZ73zvBy7Za+gP/5u1IaCP1n4xxjoB62e8ivlRHozD0cMYJ9apd2dqKOZegRW7D uDlEVBmWfPh/yrAXP2R2DjDi8PsYSqdc+6S0on/Lv8Wo6hEYeEd5qBWSTHMVe3hJ+RqN ppoKRvjdrVWvFQLf9/Rac7rnAP7N6mxQS3KjSOLBaNi/F/DwBKeTS0mEoHXvO3BG9KhX tCQfG7tyMncpPG84lC+Tn4ZgCJHiAb2zLfArkJUFBSOmfvRS5/oNv7rAO106VwOOlTeS kW4dt9n44dPFk4q/e8L/IZEpHHrcYVYKou9CODBJi2jmKJoyVi93tuP0XPUUOGhBP0Ua G8AA== X-Forwarded-Encrypted: i=1; AJvYcCW5HpGRLN+eITsJH4I3/v4nS23fhKUBicOJFCcUCsh43pKbja+f3I5SdRmCCDv54WSzQYIfQuvoqfAykBkf/HQs/xj8q/PIGgfdWbWaFB0= X-Gm-Message-State: AOJu0YxaL2Bhwz+ct1NhMmOrovA66hFP788mLCjlaX9SHQTfTSEsaYg/ 2htoI17IrtI4NatX+2lRps+rhZ9kmXRpTsQz6SSDJYTWKvdFz92hzO5j4w== X-Google-Smtp-Source: AGHT+IHBb6IFiUs8xU43oTAG+X29+KkljWdZJwP/hKf4iChRy3JNnv34wAQX382qqFSczCl24o2QqQ== X-Received: by 2002:a17:902:f542:b0:1e2:b3d:8c67 with SMTP id h2-20020a170902f54200b001e20b3d8c67mr11301029plf.6.1713178040744; Mon, 15 Apr 2024 03:47:20 -0700 (PDT) Received: from rpi.. (p5315239-ipxg23901hodogaya.kanagawa.ocn.ne.jp. [180.34.87.239]) by smtp.gmail.com with ESMTPSA id d7-20020a170902654700b001e20afa1038sm7807806pln.8.2024.04.15.03.47.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Apr 2024 03:47:20 -0700 (PDT) From: FUJITA Tomonori To: netdev@vger.kernel.org Cc: andrew@lunn.ch, rust-for-linux@vger.kernel.org, tmgross@umich.edu Subject: [PATCH net-next v1 2/4] rust: net::phy support C45 helpers Date: Mon, 15 Apr 2024 19:46:59 +0900 Message-Id: <20240415104701.4772-3-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415104701.4772-1-fujita.tomonori@gmail.com> References: <20240415104701.4772-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch adds the following helper functions for Clause 45: - mdiobus_c45_read - mdiobus_c45_write - genphy_c45_read_status Signed-off-by: FUJITA Tomonori --- rust/kernel/net/phy.rs | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs index 44b59bbf1a52..421a231421f5 100644 --- a/rust/kernel/net/phy.rs +++ b/rust/kernel/net/phy.rs @@ -203,6 +203,43 @@ pub fn write(&mut self, regnum: u16, val: u16) -> Result { }) } + /// Reads a given C45 PHY register. + /// This function reads a hardware register and updates the stats so takes `&mut self`. + pub fn c45_read(&mut self, devad: u8, regnum: u16) -> Result { + let phydev = self.0.get(); + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`. + // So it's just an FFI call. + let ret = unsafe { + bindings::mdiobus_c45_read( + (*phydev).mdio.bus, + (*phydev).mdio.addr, + devad as i32, + regnum.into(), + ) + }; + if ret < 0 { + Err(Error::from_errno(ret)) + } else { + Ok(ret as u16) + } + } + + /// Writes a given C45 PHY register. + pub fn c45_write(&mut self, devad: u8, regnum: u16, val: u16) -> Result { + let phydev = self.0.get(); + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`. + // So it's just an FFI call. + to_result(unsafe { + bindings::mdiobus_c45_write( + (*phydev).mdio.bus, + (*phydev).mdio.addr, + devad as i32, + regnum.into(), + val, + ) + }) + } + /// Reads a paged register. pub fn read_paged(&mut self, page: u16, regnum: u16) -> Result { let phydev = self.0.get(); @@ -277,6 +314,19 @@ pub fn genphy_read_status(&mut self) -> Result { } } + /// Checks the link status and updates current link state via C45 registers. + pub fn genphy_c45_read_status(&mut self) -> Result { + let phydev = self.0.get(); + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Self`. + // So it's just an FFI call. + let ret = unsafe { bindings::genphy_c45_read_status(phydev) }; + if ret < 0 { + Err(Error::from_errno(ret)) + } else { + Ok(ret as u16) + } + } + /// Updates the link status. pub fn genphy_update_link(&mut self) -> Result { let phydev = self.0.get(); From patchwork Mon Apr 15 10:47:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13629779 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B87C757876; Mon, 15 Apr 2024 10:47:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178046; cv=none; b=ecUWM36+6qNJJqiQMaINRA0PtVhgShgWpgj/Mlb+/t+Tr/VHKXe1QDHSfzpv7I1dm29gyaHTEjyeQ4LDe6Ld2omfG6VtWxtqXN7xn9usGtvz0jeMuO07UYnn8qgxs8QBnZu6GSCfrrOqc5lqzH6d+X7YsQLgBzVFBA8l7m6g3xg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178046; c=relaxed/simple; bh=ksei461v/kjUsGfd+wJGh9e0382A9W4NsZnA+JLB5gs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=cOy/SujTM09fyBwiNZ2qGUnGHNjM/ZuuSL3+pmYD6q2MWU8LiWyf4F8Bwlrs9RDXS0IauUxuEXtj/krg8ymhK7iA3TGJxAwtYWQaJc+OVsjHQz+79Mv63bsB4ys5Io6iIgnIjd9UmUNeMBWlZRPhciAY+rMx6DIVLxm7j+7uTvY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iXwbB8+R; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iXwbB8+R" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-1e45f339708so5334025ad.0; Mon, 15 Apr 2024 03:47:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713178043; x=1713782843; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uaBlxvIjzhIk8Qt+IPbhIW9BsmPzQyIbQPUOYV6Usl8=; b=iXwbB8+Ru1v2G9a+ELAz6TvfVdYpX88zDMhm8PIybi6L+6SJHVz4j/VdlicwQWCDLH 2eWXuwKMjtnW5xPp3V9ED/F6j7vC1PaA92DUMvIHDHeBUx4UyVDnT+l6NCyY4NqQt+Uh A82DoB5PLGXJpobfk6MiE3KDCSYFvc0cfazhfuNJ6815dTjc5hWDIsVJ5U45aRGaWERC Qwx7eyI/+52kWoDVd9VjPDzJiT1bV1/slZhBk7vPT8icdWHHtXAEd+MgZ0Aqf1aiQN4x imlIv2CwSRKwZt0nWFxkZcGtY1MZYstuXhPXNyS0skrojxcTj33P7oZGgqOMuxcRZjSq 9ynA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713178043; x=1713782843; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uaBlxvIjzhIk8Qt+IPbhIW9BsmPzQyIbQPUOYV6Usl8=; b=kdmdBtnPA8k37+P6HpKRXRqj0lBCNVn/JdQdeEBa3zdF7fLxSrYxpAMUrHRlukeAF5 j7otJPw71s3ddBiX82qZ8qxa7NiWyAK12OaNtL/FpjXsESJ/whUfq+6DocjMdH95ORVB iYpa9Se/Jez3u3FTA/LiobofFI+/SkoZiCPMMshJJ9hPHGUqX7f2PaDVIUZRQUNYJX8g huyC1hQolBPub4JfBSjxCIYObH035ozH9snC6Ne7y/FOWdcMOL7UwqtHT3lMSkLZSN2B RGYkvrF9HaHTuyXR9WBo5GB8djDJYF2h+GKn1BRd/7r8nPHpxCsX8J5ePPAET6dGhGnK sNyQ== X-Forwarded-Encrypted: i=1; AJvYcCXw3jVDgobHRgb0kb/oTehCnWA/WQZPwzBpV4QktlYAmrQpcqNAG7ocz9XomN6tYlJjGJYH1DmNzEXCOO2nbMjlD4gDbdOEQDbAyegi8wg= X-Gm-Message-State: AOJu0YxEgMa2yB/ao4VPFnjg9OpGSf0+JLW73YSomFnpKtxlN8WhDcy8 X+YZjBgE4A0ThIKGCr0HQQJ6ovFwI8NX8cBAT+b6XvBdbUwEyzxFVve6gxiv X-Google-Smtp-Source: AGHT+IF0sPp1WW2BdNTKBq55dR2f88/opUxXD/GasCgBBnQYUbn8L9c2XhB0RcKgxvq0nSa3HjXBXg== X-Received: by 2002:a17:902:c94f:b0:1dc:c28e:2236 with SMTP id i15-20020a170902c94f00b001dcc28e2236mr12263179pla.2.1713178042845; Mon, 15 Apr 2024 03:47:22 -0700 (PDT) Received: from rpi.. (p5315239-ipxg23901hodogaya.kanagawa.ocn.ne.jp. [180.34.87.239]) by smtp.gmail.com with ESMTPSA id d7-20020a170902654700b001e20afa1038sm7807806pln.8.2024.04.15.03.47.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Apr 2024 03:47:22 -0700 (PDT) From: FUJITA Tomonori To: netdev@vger.kernel.org Cc: andrew@lunn.ch, rust-for-linux@vger.kernel.org, tmgross@umich.edu, Luis Chamberlain , Russ Weight Subject: [PATCH net-next v1 3/4] rust: net::phy support Firmware API Date: Mon, 15 Apr 2024 19:47:00 +0900 Message-Id: <20240415104701.4772-4-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415104701.4772-1-fujita.tomonori@gmail.com> References: <20240415104701.4772-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This patch adds support to the following basic Firmware API: - request_firmware - release_firmware Signed-off-by: FUJITA Tomonori CC: Luis Chamberlain CC: Russ Weight --- drivers/net/phy/Kconfig | 1 + rust/bindings/bindings_helper.h | 1 + rust/kernel/net/phy.rs | 45 +++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 7fddc8306d82..3ad04170aa4e 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -64,6 +64,7 @@ config RUST_PHYLIB_ABSTRACTIONS bool "Rust PHYLIB abstractions support" depends on RUST depends on PHYLIB=y + depends on FW_LOADER=y help Adds support needed for PHY drivers written in Rust. It provides a wrapper around the C phylib core. diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index 65b98831b975..556f95c55b7b 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs index 421a231421f5..095dc3ccc553 100644 --- a/rust/kernel/net/phy.rs +++ b/rust/kernel/net/phy.rs @@ -9,6 +9,51 @@ use crate::{bindings, error::*, prelude::*, str::CStr, types::Opaque}; use core::marker::PhantomData; +use core::ptr::{self, NonNull}; + +/// A pointer to the kernel's `struct firmware`. +/// +/// # Invariants +/// +/// The pointer points at a `struct firmware`, and has ownership over the object. +pub struct Firmware(NonNull); + +impl Firmware { + /// Loads a firmware. + pub fn new(name: &CStr, dev: &Device) -> Result { + let phydev = dev.0.get(); + let mut ptr: *mut bindings::firmware = ptr::null_mut(); + let p_ptr: *mut *mut bindings::firmware = &mut ptr; + // SAFETY: `phydev` is pointing to a valid object by the type invariant of `Device`. + // So it's just an FFI call. + let ret = unsafe { + bindings::request_firmware( + p_ptr as *mut *const bindings::firmware, + name.as_char_ptr().cast(), + &mut (*phydev).mdio.dev, + ) + }; + let fw = NonNull::new(ptr).ok_or_else(|| Error::from_errno(ret))?; + // INVARIANT: We checked that the firmware was successfully loaded. + Ok(Firmware(fw)) + } + + /// Accesses the firmware contents. + pub fn data(&self) -> &[u8] { + // SAFETY: The type invariants guarantee that `self.0.as_ptr()` is valid. + // They also guarantee that `self.0.as_ptr().data` pointers to + // a valid memory region of size `self.0.as_ptr().size`. + unsafe { core::slice::from_raw_parts((*self.0.as_ptr()).data, (*self.0.as_ptr()).size) } + } +} + +impl Drop for Firmware { + fn drop(&mut self) { + // SAFETY: By the type invariants, `self.0.as_ptr()` is valid and + // we have ownership of the object so can free it. + unsafe { bindings::release_firmware(self.0.as_ptr()) } + } +} /// PHY state machine states. /// From patchwork Mon Apr 15 10:47:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: FUJITA Tomonori X-Patchwork-Id: 13629780 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5C0A55C902; Mon, 15 Apr 2024 10:47:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178046; cv=none; b=TglJpdvPm5xyDbvmBEOJYG3KoMASSzmCjo5KtnD7zF0N7Jc1rBCQ3LavHoqnQpf0vzq0cdUxOVV3MoHZSPLDX9GxAyrSJ08XQpcVncFp//rYpinSqm6YGn3fpouD37UuzUScW7jxIE1FBICCGQY9Jv7E3C78BS7cNDrcYy7rN7k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178046; c=relaxed/simple; bh=YqKX4wriXAtnIM/JGv9nvIiRNMzJYkycaNwKhjTmUCQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZByiZlPtk4gvVHL/s6bA3I21tvCn2Lt9LKKt6od7tEXRCLxAbaIfDRsm0tGAc8bRTHFNCtIAIffN9eoDVbRFXLN0U7I1/xPp0K1JYcfN+/nub6CNHo+Rr1lCDKDqH2ZGrz5la3bY23OvQZNUGeG/s+GkX3pNHgrzEWBBWlbeJnw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IrnIumQh; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IrnIumQh" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-1e45f339708so5334055ad.0; Mon, 15 Apr 2024 03:47:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713178044; x=1713782844; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KuGWEpVupawPMlvYk1r1Gqqq+H/sSkI0jwfxINnsGuc=; b=IrnIumQhSgyrAF0KKL+etCs35zEVCWkEBURd4f2+h8aU577OTStWzCa83hyinovxkC OX/qVzZA7wdTy6a/ntAlf1Y7mGZj7QddNMrBFBziId/w1+G/7lq+lZymT/T1S5Wwas6K nhjQuWTLcnOH9borSlosTBGybumWV5jeU+37WIja4nGyBrIGmVYBTPGM/5HrM+IMNa6f 2M6jMhwKsPiXiskyaN5eIuQigITj7hZlBh2Q3XV1DOgw73zF8aOywOyumjl4dJzCigul FK3tBsZ2o/LyGk9jVDpkTn5QVYv+TtGIRZC7cvI5yG5B1jIOMJD+QUKDRoFfIlQWHjSN nNNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713178044; x=1713782844; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KuGWEpVupawPMlvYk1r1Gqqq+H/sSkI0jwfxINnsGuc=; b=MXNW7HKpwtRqeiOdwPe4afEktXlZyHfi2jj4qG2KOyL9UChI11ZbAuvqyQV6lVDTlN JAahgwZYJrQVEfTBwt5KFZMjDOc+NycNX988qwgVmT3xAjBtgQSMS+j8vwEAZfySZwZm knsUqQ9RLFpscLffG+N2o4NguGo1HEbM25V1IsfnpiHbR6EVW7oBKiqDOzmPHgdqD8pR IOxEVUHoPIdagWMaatFHtd+Vd1BSZkdANykYBZM04C6l92RJc47vezEuwaZYTUjfXIFj HFYchBbIRsnocO3GYaRjD+xMXOi7JplMKZf8JVWReyWwUZS3LyASNofU0cweXb4hE1aL /L/Q== X-Forwarded-Encrypted: i=1; AJvYcCUMkwJd+LndjMtmDxqoxFix/u8lwRAIP5ZbB57xMgKvMvo+TDm98NSUwtccPrwN5Y6OCDI9t2tHInNn382m+u5qK+A0e6+1baCPLZ+HkTI= X-Gm-Message-State: AOJu0YwmFTKbRTtaFfHCnAlLqxOg4jiAuWEQ/iVfAIjVod0byveY2Uw9 2A4+rgrebMZC64rCOE61R8TgFA/1WHmH/kl2cQfG7b9TmIwRARwZ9y2UlA== X-Google-Smtp-Source: AGHT+IEZ9OSO247b6f+EAz1CmZ+duvAxD9xV+suTGWux3++UqlxWrmm8uT2YgTwrUHkRraRoHRQN9A== X-Received: by 2002:a17:902:e845:b0:1e0:c887:f93f with SMTP id t5-20020a170902e84500b001e0c887f93fmr12692959plg.1.1713178044490; Mon, 15 Apr 2024 03:47:24 -0700 (PDT) Received: from rpi.. (p5315239-ipxg23901hodogaya.kanagawa.ocn.ne.jp. [180.34.87.239]) by smtp.gmail.com with ESMTPSA id d7-20020a170902654700b001e20afa1038sm7807806pln.8.2024.04.15.03.47.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Apr 2024 03:47:24 -0700 (PDT) From: FUJITA Tomonori To: netdev@vger.kernel.org Cc: andrew@lunn.ch, rust-for-linux@vger.kernel.org, tmgross@umich.edu Subject: [PATCH net-next v1 4/4] net: phy: add Applied Micro QT2025 PHY driver Date: Mon, 15 Apr 2024 19:47:01 +0900 Message-Id: <20240415104701.4772-5-fujita.tomonori@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240415104701.4772-1-fujita.tomonori@gmail.com> References: <20240415104701.4772-1-fujita.tomonori@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org This driver supports Applied Micro Circuits Corporation QT2025 PHY, based on a driver for Tehuti Networks TN40xx chips. The original driver for TN40xx chips supports multiple PHY hardware (AMCC QT2025, TI TLK10232, Aqrate AQR105, and Marvell 88X3120, 88X3310, and MV88E2010). This driver is extracted from the original driver and modified to a PHY driver in Rust. This has been tested with Edimax EN-9320SFP+ 10G network adapter. Signed-off-by: FUJITA Tomonori --- MAINTAINERS | 7 ++++ drivers/net/phy/Kconfig | 6 ++++ drivers/net/phy/Makefile | 1 + drivers/net/phy/qt2025.rs | 75 +++++++++++++++++++++++++++++++++++++++ rust/uapi/uapi_helper.h | 1 + 5 files changed, 90 insertions(+) create mode 100644 drivers/net/phy/qt2025.rs diff --git a/MAINTAINERS b/MAINTAINERS index 5ba3fe6ac09c..f2d86e221ba3 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1540,6 +1540,13 @@ F: Documentation/admin-guide/perf/xgene-pmu.rst F: Documentation/devicetree/bindings/perf/apm-xgene-pmu.txt F: drivers/perf/xgene_pmu.c +APPLIED MICRO QT2025 PHY DRIVER +M: FUJITA Tomonori +L: netdev@vger.kernel.org +L: rust-for-linux@vger.kernel.org +S: Maintained +F: drivers/net/phy/qt2025.rs + APTINA CAMERA SENSOR PLL M: Laurent Pinchart L: linux-media@vger.kernel.org diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 3ad04170aa4e..8293c3d14229 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -110,6 +110,12 @@ config ADIN1100_PHY Currently supports the: - ADIN1100 - Robust,Industrial, Low Power 10BASE-T1L Ethernet PHY +config AMCC_QT2025_PHY + tristate "AMCC QT2025 PHY" + depends on RUST_PHYLIB_ABSTRACTIONS + help + Adds support for the Applied Micro Circuits Corporation QT2025 PHY. + source "drivers/net/phy/aquantia/Kconfig" config AX88796B_PHY diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 1d8be374915f..75d0b07a392a 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -36,6 +36,7 @@ obj-$(CONFIG_ADIN_PHY) += adin.o obj-$(CONFIG_ADIN1100_PHY) += adin1100.o obj-$(CONFIG_AIR_EN8811H_PHY) += air_en8811h.o obj-$(CONFIG_AMD_PHY) += amd.o +obj-$(CONFIG_AMCC_QT2025_PHY) += qt2025.o obj-$(CONFIG_AQUANTIA_PHY) += aquantia/ ifdef CONFIG_AX88796B_RUST_PHY obj-$(CONFIG_AX88796B_PHY) += ax88796b_rust.o diff --git a/drivers/net/phy/qt2025.rs b/drivers/net/phy/qt2025.rs new file mode 100644 index 000000000000..e42b77753717 --- /dev/null +++ b/drivers/net/phy/qt2025.rs @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) Tehuti Networks Ltd. +// Copyright (C) 2024 FUJITA Tomonori + +//! Applied Micro Circuits Corporation QT2025 PHY driver +use kernel::c_str; +use kernel::net::phy::{self, DeviceId, Driver, Firmware}; +use kernel::prelude::*; +use kernel::uapi; + +kernel::module_phy_driver! { + drivers: [PhyQT2025], + device_table: [ + DeviceId::new_with_driver::(), + ], + name: "qt2025_phy", + author: "FUJITA Tomonori ", + description: "AMCC QT2025 PHY driver", + license: "GPL", +} + +const MDIO_MMD_PMAPMD: u8 = uapi::MDIO_MMD_PMAPMD as u8; +const MDIO_MMD_PCS: u8 = uapi::MDIO_MMD_PCS as u8; +const MDIO_MMD_PHYXS: u8 = uapi::MDIO_MMD_PHYXS as u8; + +struct PhyQT2025; + +#[vtable] +impl Driver for PhyQT2025 { + const NAME: &'static CStr = c_str!("QT2025 10Gpbs SFP+"); + const PHY_DEVICE_ID: phy::DeviceId = phy::DeviceId::new_with_exact_mask(0x0043A400); + + fn config_init(dev: &mut phy::Device) -> Result<()> { + let fw = Firmware::new(c_str!("qt2025-2.0.3.3.fw"), dev)?; + + let phy_id = dev.c45_read(MDIO_MMD_PMAPMD, 0xd001)?; + if (phy_id >> 8) & 0xff != 0xb3 { + return Ok(()); + } + + dev.c45_write(MDIO_MMD_PMAPMD, 0xC300, 0x0000)?; + dev.c45_write(MDIO_MMD_PMAPMD, 0xC302, 0x4)?; + dev.c45_write(MDIO_MMD_PMAPMD, 0xC319, 0x0038)?; + + dev.c45_write(MDIO_MMD_PMAPMD, 0xC31A, 0x0098)?; + dev.c45_write(MDIO_MMD_PCS, 0x0026, 0x0E00)?; + + dev.c45_write(MDIO_MMD_PCS, 0x0027, 0x0893)?; + + dev.c45_write(MDIO_MMD_PCS, 0x0028, 0xA528)?; + dev.c45_write(MDIO_MMD_PCS, 0x0029, 0x03)?; + dev.c45_write(MDIO_MMD_PMAPMD, 0xC30A, 0x06E1)?; + dev.c45_write(MDIO_MMD_PMAPMD, 0xC300, 0x0002)?; + dev.c45_write(MDIO_MMD_PCS, 0xE854, 0x00C0)?; + + let mut j = 0x8000; + let mut a = MDIO_MMD_PCS; + for (i, val) in fw.data().iter().enumerate() { + if i == 0x4000 { + a = MDIO_MMD_PHYXS; + j = 0x8000; + } + dev.c45_write(a, j, (*val).into())?; + + j += 1; + } + dev.c45_write(MDIO_MMD_PCS, 0xe854, 0x0040)?; + + Ok(()) + } + + fn read_status(dev: &mut phy::Device) -> Result { + dev.genphy_c45_read_status() + } +} diff --git a/rust/uapi/uapi_helper.h b/rust/uapi/uapi_helper.h index 08f5e9334c9e..76d3f103e764 100644 --- a/rust/uapi/uapi_helper.h +++ b/rust/uapi/uapi_helper.h @@ -7,5 +7,6 @@ */ #include +#include #include #include