From owner-svn-src-head@freebsd.org Fri Dec 11 07:20:35 2015 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B681F9D6463; Fri, 11 Dec 2015 07:20:35 +0000 (UTC) (envelope-from arybchik@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 764D81046; Fri, 11 Dec 2015 07:20:35 +0000 (UTC) (envelope-from arybchik@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id tBB7KYtv053484; Fri, 11 Dec 2015 07:20:34 GMT (envelope-from arybchik@FreeBSD.org) Received: (from arybchik@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id tBB7KX98053478; Fri, 11 Dec 2015 07:20:33 GMT (envelope-from arybchik@FreeBSD.org) Message-Id: <201512110720.tBB7KX98053478@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: arybchik set sender to arybchik@FreeBSD.org using -f From: Andrew Rybchenko Date: Fri, 11 Dec 2015 07:20:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r292090 - head/sys/dev/sfxge/common X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Dec 2015 07:20:35 -0000 Author: arybchik Date: Fri Dec 11 07:20:33 2015 New Revision: 292090 URL: https://svnweb.freebsd.org/changeset/base/292090 Log: sfxge: unify MCDI response polling Submitted by: Andy Moreton Reviewed by: philip Sponsored by: Solarflare Communications, Inc. MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D4496 Modified: head/sys/dev/sfxge/common/efx_impl.h head/sys/dev/sfxge/common/efx_mcdi.c head/sys/dev/sfxge/common/hunt_impl.h head/sys/dev/sfxge/common/hunt_mcdi.c head/sys/dev/sfxge/common/siena_impl.h head/sys/dev/sfxge/common/siena_mcdi.c Modified: head/sys/dev/sfxge/common/efx_impl.h ============================================================================== --- head/sys/dev/sfxge/common/efx_impl.h Fri Dec 11 06:41:01 2015 (r292089) +++ head/sys/dev/sfxge/common/efx_impl.h Fri Dec 11 07:20:33 2015 (r292090) @@ -456,12 +456,12 @@ typedef struct efx_mcdi_ops_s { efx_rc_t (*emco_init)(efx_nic_t *, const efx_mcdi_transport_t *); void (*emco_request_copyin)(efx_nic_t *, efx_mcdi_req_t *, unsigned int, boolean_t, boolean_t); - boolean_t (*emco_request_poll)(efx_nic_t *); void (*emco_request_copyout)(efx_nic_t *, efx_mcdi_req_t *); efx_rc_t (*emco_poll_reboot)(efx_nic_t *); + boolean_t (*emco_poll_response)(efx_nic_t *); + void (*emco_read_response)(efx_nic_t *, void *, size_t, size_t); void (*emco_fini)(efx_nic_t *); efx_rc_t (*emco_feature_supported)(efx_nic_t *, efx_mcdi_feature_id_t, boolean_t *); - void (*emco_read_response)(efx_nic_t *, void *, size_t, size_t); } efx_mcdi_ops_t; typedef struct efx_mcdi_s { Modified: head/sys/dev/sfxge/common/efx_mcdi.c ============================================================================== --- head/sys/dev/sfxge/common/efx_mcdi.c Fri Dec 11 06:41:01 2015 (r292089) +++ head/sys/dev/sfxge/common/efx_mcdi.c Fri Dec 11 07:20:33 2015 (r292090) @@ -46,12 +46,12 @@ __FBSDID("$FreeBSD$"); static efx_mcdi_ops_t __efx_mcdi_siena_ops = { siena_mcdi_init, /* emco_init */ siena_mcdi_request_copyin, /* emco_request_copyin */ - siena_mcdi_request_poll, /* emco_request_poll */ siena_mcdi_request_copyout, /* emco_request_copyout */ siena_mcdi_poll_reboot, /* emco_poll_reboot */ + siena_mcdi_poll_response, /* emco_poll_response */ + siena_mcdi_read_response, /* emco_read_response */ siena_mcdi_fini, /* emco_fini */ siena_mcdi_feature_supported, /* emco_feature_supported */ - siena_mcdi_read_response, /* emco_read_response */ }; #endif /* EFSYS_OPT_SIENA */ @@ -61,12 +61,12 @@ static efx_mcdi_ops_t __efx_mcdi_siena_o static efx_mcdi_ops_t __efx_mcdi_hunt_ops = { hunt_mcdi_init, /* emco_init */ hunt_mcdi_request_copyin, /* emco_request_copyin */ - hunt_mcdi_request_poll, /* emco_request_poll */ hunt_mcdi_request_copyout, /* emco_request_copyout */ hunt_mcdi_poll_reboot, /* emco_poll_reboot */ + hunt_mcdi_poll_response, /* emco_poll_response */ + hunt_mcdi_read_response, /* emco_read_response */ hunt_mcdi_fini, /* emco_fini */ hunt_mcdi_feature_supported, /* emco_feature_supported */ - hunt_mcdi_read_response, /* emco_read_response */ }; #endif /* EFSYS_OPT_HUNTINGTON */ @@ -189,7 +189,7 @@ efx_mcdi_request_copyin( emcop->emco_request_copyin(enp, emrp, seq, ev_cpl, new_epoch); } -static void __unused +static void efx_mcdi_request_copyout( __in efx_nic_t *enp, __in efx_mcdi_req_t *emrp) @@ -210,6 +210,17 @@ efx_mcdi_poll_reboot( return (rc); } +static boolean_t +efx_mcdi_poll_response( + __in efx_nic_t *enp) +{ + efx_mcdi_ops_t *emcop = enp->en_mcdi.em_emcop; + boolean_t available; + + available = emcop->emco_poll_response(enp); + return (available); +} + static void efx_mcdi_read_response( __in efx_nic_t *enp, @@ -389,19 +400,63 @@ fail1: efx_mcdi_request_poll( __in efx_nic_t *enp) { - efx_mcdi_ops_t *emcop = enp->en_mcdi.em_emcop; - boolean_t completed; + efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip); + efx_mcdi_req_t *emrp; + int state; + efx_rc_t rc; EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI); EFSYS_ASSERT3U(enp->en_features, &, EFX_FEATURE_MCDI); - completed = B_FALSE; + /* Serialise against post-watchdog efx_mcdi_ev* */ + EFSYS_LOCK(enp->en_eslp, state); + + EFSYS_ASSERT(emip->emi_pending_req != NULL); + EFSYS_ASSERT(!emip->emi_ev_cpl); + emrp = emip->emi_pending_req; + + /* Check for reboot atomically w.r.t efx_mcdi_request_start */ + if (emip->emi_poll_cnt++ == 0) { + if ((rc = efx_mcdi_poll_reboot(enp)) != 0) { + emip->emi_pending_req = NULL; + EFSYS_UNLOCK(enp->en_eslp, state); + goto fail1; + } + } + + /* Check if a response is available */ + if (efx_mcdi_poll_response(enp) == B_FALSE) { + EFSYS_UNLOCK(enp->en_eslp, state); + return (B_FALSE); + } + + /* Read the response header */ + efx_mcdi_read_response_header(enp, emrp); + + /* Request complete */ + emip->emi_pending_req = NULL; + + EFSYS_UNLOCK(enp->en_eslp, state); + + if ((rc = emrp->emr_rc) != 0) + goto fail2; + + efx_mcdi_request_copyout(enp, emrp); + return (B_TRUE); + +fail2: + if (!emrp->emr_quiet) + EFSYS_PROBE(fail2); +fail1: + if (!emrp->emr_quiet) + EFSYS_PROBE1(fail1, efx_rc_t, rc); - if (emcop != NULL && emcop->emco_request_poll != NULL) - completed = emcop->emco_request_poll(enp); + /* Reboot/Assertion */ + if (rc == EIO || rc == EINTR) + efx_mcdi_raise_exception(enp, emrp, rc); - return (completed); + return (B_TRUE); } __checkReturn boolean_t Modified: head/sys/dev/sfxge/common/hunt_impl.h ============================================================================== --- head/sys/dev/sfxge/common/hunt_impl.h Fri Dec 11 06:41:01 2015 (r292089) +++ head/sys/dev/sfxge/common/hunt_impl.h Fri Dec 11 07:20:33 2015 (r292090) @@ -263,6 +263,10 @@ hunt_mcdi_request_copyin( __in boolean_t ev_cpl, __in boolean_t new_epoch); +extern __checkReturn boolean_t +hunt_mcdi_poll_response( + __in efx_nic_t *enp); + extern void hunt_mcdi_read_response( __in efx_nic_t *enp, @@ -270,10 +274,6 @@ hunt_mcdi_read_response( __in size_t offset, __in size_t length); -extern __checkReturn boolean_t -hunt_mcdi_request_poll( - __in efx_nic_t *enp); - extern void hunt_mcdi_request_copyout( __in efx_nic_t *enp, Modified: head/sys/dev/sfxge/common/hunt_mcdi.c ============================================================================== --- head/sys/dev/sfxge/common/hunt_mcdi.c Fri Dec 11 06:41:01 2015 (r292089) +++ head/sys/dev/sfxge/common/hunt_mcdi.c Fri Dec 11 07:20:33 2015 (r292090) @@ -268,7 +268,7 @@ hunt_mcdi_request_copyout( #endif /* EFSYS_OPT_MCDI_LOGGING */ } -static __checkReturn boolean_t + __checkReturn boolean_t hunt_mcdi_poll_response( __in efx_nic_t *enp) { @@ -299,59 +299,6 @@ hunt_mcdi_read_response( } } - __checkReturn boolean_t -hunt_mcdi_request_poll( - __in efx_nic_t *enp) -{ - efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip); - efx_mcdi_req_t *emrp; - int state; - efx_rc_t rc; - - EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_HUNTINGTON); - - /* Serialise against post-watchdog efx_mcdi_ev* */ - EFSYS_LOCK(enp->en_eslp, state); - - EFSYS_ASSERT(emip->emi_pending_req != NULL); - EFSYS_ASSERT(!emip->emi_ev_cpl); - emrp = emip->emi_pending_req; - - /* Check if a response is available */ - if (hunt_mcdi_poll_response(enp) == B_FALSE) { - EFSYS_UNLOCK(enp->en_eslp, state); - return (B_FALSE); - } - - /* Read the response header */ - efx_mcdi_read_response_header(enp, emrp); - - /* Request complete */ - emip->emi_pending_req = NULL; - - /* Ensure stale MCDI requests fail after an MC reboot. */ - emip->emi_new_epoch = B_FALSE; - - EFSYS_UNLOCK(enp->en_eslp, state); - - if ((rc = emrp->emr_rc) != 0) - goto fail1; - - hunt_mcdi_request_copyout(enp, emrp); - goto out; - -fail1: - if (!emrp->emr_quiet) - EFSYS_PROBE1(fail1, efx_rc_t, rc); - - /* Reboot/Assertion */ - if (rc == EIO || rc == EINTR) - efx_mcdi_raise_exception(enp, emrp, rc); - -out: - return (B_TRUE); -} - efx_rc_t hunt_mcdi_poll_reboot( __in efx_nic_t *enp) Modified: head/sys/dev/sfxge/common/siena_impl.h ============================================================================== --- head/sys/dev/sfxge/common/siena_impl.h Fri Dec 11 06:41:01 2015 (r292089) +++ head/sys/dev/sfxge/common/siena_impl.h Fri Dec 11 07:20:33 2015 (r292090) @@ -121,6 +121,10 @@ siena_mcdi_request_copyin( __in boolean_t ev_cpl, __in boolean_t new_epoch); +extern __checkReturn boolean_t +siena_mcdi_poll_response( + __in efx_nic_t *enp); + extern void siena_mcdi_read_response( __in efx_nic_t *enp, @@ -128,10 +132,6 @@ siena_mcdi_read_response( __in size_t offset, __in size_t length); -extern __checkReturn boolean_t -siena_mcdi_request_poll( - __in efx_nic_t *enp); - extern void siena_mcdi_request_copyout( __in efx_nic_t *enp, Modified: head/sys/dev/sfxge/common/siena_mcdi.c ============================================================================== --- head/sys/dev/sfxge/common/siena_mcdi.c Fri Dec 11 06:41:01 2015 (r292089) +++ head/sys/dev/sfxge/common/siena_mcdi.c Fri Dec 11 07:20:33 2015 (r292090) @@ -180,7 +180,7 @@ siena_mcdi_poll_reboot( #endif } -static __checkReturn boolean_t +extern __checkReturn boolean_t siena_mcdi_poll_response( __in efx_nic_t *enp) { @@ -218,69 +218,6 @@ siena_mcdi_read_response( } } - __checkReturn boolean_t -siena_mcdi_request_poll( - __in efx_nic_t *enp) -{ - efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip); - efx_mcdi_req_t *emrp; - int state; - efx_rc_t rc; - - EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA); - - /* Serialise against post-watchdog efx_mcdi_ev* */ - EFSYS_LOCK(enp->en_eslp, state); - - EFSYS_ASSERT(emip->emi_pending_req != NULL); - EFSYS_ASSERT(!emip->emi_ev_cpl); - emrp = emip->emi_pending_req; - - /* Check for reboot atomically w.r.t efx_mcdi_request_start */ - if (emip->emi_poll_cnt++ == 0) { - if ((rc = siena_mcdi_poll_reboot(enp)) != 0) { - emip->emi_pending_req = NULL; - EFSYS_UNLOCK(enp->en_eslp, state); - - goto fail1; - } - } - - /* Check if a response is available */ - if (siena_mcdi_poll_response(enp) == B_FALSE) { - EFSYS_UNLOCK(enp->en_eslp, state); - return (B_FALSE); - } - - /* Read the response header */ - efx_mcdi_read_response_header(enp, emrp); - - /* Request complete */ - emip->emi_pending_req = NULL; - - EFSYS_UNLOCK(enp->en_eslp, state); - - if ((rc = emrp->emr_rc) != 0) - goto fail2; - - siena_mcdi_request_copyout(enp, emrp); - goto out; - -fail2: - if (!emrp->emr_quiet) - EFSYS_PROBE(fail2); -fail1: - if (!emrp->emr_quiet) - EFSYS_PROBE1(fail1, efx_rc_t, rc); - - /* Reboot/Assertion */ - if (rc == EIO || rc == EINTR) - efx_mcdi_raise_exception(enp, emrp, rc); - -out: - return (B_TRUE); -} - __checkReturn efx_rc_t siena_mcdi_init( __in efx_nic_t *enp,