From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1UPhop-0007jG-Tp for mharc-grub-devel@gnu.org; Tue, 09 Apr 2013 19:19:15 -0400 Received: from eggs.gnu.org ([208.118.235.92]:50510) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UPhon-0007if-GS for grub-devel@gnu.org; Tue, 09 Apr 2013 19:19:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UPhol-0003qH-VB for grub-devel@gnu.org; Tue, 09 Apr 2013 19:19:13 -0400 Received: from mail-ee0-f52.google.com ([74.125.83.52]:37402) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UPhol-0003q9-Lu for grub-devel@gnu.org; Tue, 09 Apr 2013 19:19:11 -0400 Received: by mail-ee0-f52.google.com with SMTP id d17so3079705eek.11 for ; Tue, 09 Apr 2013 16:19:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :x-enigmail-version:content-type; bh=Efgkthw7YJ0PsXp6ifq+fJcBfE7Wk0UhG2ytH6bREXw=; b=KHTVf8ZMxu7jO8Sk9H52PTqDYCEo15yXPI7IDx0vgOLJAtjFT5kF+TL5n83mBZ8yg5 LL1rfiT8u5B7jICsf2xNfUGomBAyXk1YimPLjTmKVsDj4Z1mcavFFTGUcWpcBq3eds3Z zBtdElgYRy8y5Eez2nDhvHTMkbYcNBQqsdAaG4pf3HVMUdUI1DuHv27OZKi8xyvLGNBP W10Z2BLJ6OZKpTM8ZjRDtnyXM2AdiH7a5jtzjX5a6ooIr+TyM1g8cC+bQpdTOW362lwx 9bqE9k1iaAcsdP4QdiHGrkQrnf9pjJyRGOTprp67c3Qe2Usd48V59MO79sVfnYqX6B5N T/PA== X-Received: by 10.14.1.130 with SMTP id 2mr64351209eed.15.1365549550855; Tue, 09 Apr 2013 16:19:10 -0700 (PDT) Received: from debian.x201.phnet (245-188.1-85.cust.bluewin.ch. [85.1.188.245]) by mx.google.com with ESMTPS id l4sm1250296eem.2.2013.04.09.16.19.09 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 09 Apr 2013 16:19:10 -0700 (PDT) Message-ID: <5164A1EC.8000701@gmail.com> Date: Wed, 10 Apr 2013 01:19:08 +0200 From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20130116 Icedove/10.0.12 MIME-Version: 1.0 To: The development of GRUB 2 Subject: [PATCH, RFT] ubootnet X-Enigmail-Version: 1.4.1 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="------------enigFAB92802FECFB8EC5EC1502F" X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 74.125.83.52 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Apr 2013 23:19:15 -0000 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigFAB92802FECFB8EC5EC1502F Content-Type: multipart/mixed; boundary="------------040908010002010208010505" This is a multi-part message in MIME format. --------------040908010002010208010505 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Raspberry pi u-boot doesn't support network. Could someone test this? --------------040908010002010208010505 Content-Type: text/x-diff; name="ubootnet.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="ubootnet.diff" =3D=3D=3D modified file 'grub-core/Makefile.core.def' --- grub-core/Makefile.core.def 2013-04-07 00:41:07 +0000 +++ grub-core/Makefile.core.def 2013-04-09 22:05:01 +0000 @@ -1831,6 +1831,12 @@ }; =20 module =3D { + name =3D ubootnet; + common =3D net/drivers/uboot/ubootnet.c; + enable =3D uboot; +}; + +module =3D { name =3D efinet; common =3D net/drivers/efi/efinet.c; enable =3D efi; =3D=3D=3D added directory 'grub-core/net/drivers/uboot' =3D=3D=3D added file 'grub-core/net/drivers/uboot/ubootnet.c' --- grub-core/net/drivers/uboot/ubootnet.c 1970-01-01 00:00:00 +0000 +++ grub-core/net/drivers/uboot/ubootnet.c 2013-04-09 22:28:48 +0000 @@ -0,0 +1,182 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2013 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by= + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include + +GRUB_MOD_LICENSE ("GPLv3+"); + +struct ubootnet_data +{ + void *cookie; + int handle; +}; + +static grub_err_t +card_open (struct grub_net_card *dev) +{ + int status; + struct ubootnet_data *data =3D dev->data; + + status =3D uboot_dev_open (data->handle); + if (status) + return grub_error (GRUB_ERR_IO, "Couldn't open network card."); + + return GRUB_ERR_NONE; +} + +static void +card_close (struct grub_net_card *dev) +{ + struct ubootnet_data *data =3D dev->data; + + uboot_dev_close (data->handle); +} + +static grub_err_t +send_card_buffer (struct grub_net_card *dev, struct grub_net_buff *pack)= +{ + int status; + struct ubootnet_data *data =3D dev->data; + grub_size_t len; + + len =3D (pack->tail - pack->data); + if (len > dev->mtu) + len =3D dev->mtu; + + grub_memcpy (dev->txbuf, pack->data, len); + status =3D uboot_dev_send (data->handle, dev->txbuf, + len); + + if (status) + return grub_error (GRUB_ERR_IO, N_("couldn't send network packet"));= + return GRUB_ERR_NONE; +} + +static struct grub_net_buff * +get_card_packet (struct grub_net_card *dev) +{ + int rc; + struct ubootnet_data *data =3D dev->data; + grub_uint64_t start_time; + struct grub_net_buff *nb; + int actual; + + nb =3D grub_netbuff_alloc (dev->mtu + 64 + 2); + if (!nb) + { + grub_netbuff_free (nb); + return NULL; + } + /* Reserve 2 bytes so that 2 + 14/18 bytes of ethernet header is divis= ible + by 4. So that IP header is aligned on 4 bytes. */ + grub_netbuff_reserve (nb, 2); + + start_time =3D grub_get_time_ms (); + do + rc =3D uboot_dev_recv (data->handle, nb->data, dev->mtu + 64, &actua= l); + while ((actual <=3D 0 || rc < 0) && (grub_get_time_ms () - start_time = < 200)); + if (actual > 0) + { + grub_netbuff_put (nb, actual); + return nb; + } + grub_netbuff_free (nb); + return NULL; +} + +static struct grub_net_card_driver ubootnet =3D + { + .name =3D "ubnet", + .open =3D card_open, + .close =3D card_close, + .send =3D send_card_buffer, + .recv =3D get_card_packet + }; + +GRUB_MOD_INIT (ubootnet) +{ + int devcount, i; + int nfound =3D 0; + + devcount =3D uboot_dev_enum (); + + for (i =3D 0; i < devcount; i++) + { + struct device_info *devinfo =3D uboot_dev_get (i); + struct ubootnet_data *ubdata; + struct grub_net_card *card; + + if (!(devinfo->type & DEV_TYP_NET)) + continue; + =20 + ubdata =3D grub_malloc (sizeof (struct ubootnet_data)); + if (!ubdata) + { + grub_print_error (); + return; + } + card =3D grub_zalloc (sizeof (struct grub_net_card)); + if (!card) + { + grub_free (ubdata); + grub_print_error (); + return; + } + + ubdata->handle =3D i; + ubdata->cookie =3D devinfo->cookie; + + /* FIXME: Any way to check this? */ + card->mtu =3D 1500; + + grub_memcpy (&(card->default_address.mac), &devinfo->di_net.hwaddr= , 6); + card->default_address.type =3D GRUB_NET_LINK_LEVEL_PROTOCOL_ETHERN= ET; + + card->txbufsize =3D ALIGN_UP (card->mtu, 64) + 256; + card->txbuf =3D grub_zalloc (card->txbufsize); + if (!card->txbuf) + { + grub_print_error (); + continue; + } + + card->data =3D ubdata; + card->flags =3D 0; + card->name =3D grub_xasprintf ("ubnet_%d", ++nfound); + card->idle_poll_delay_ms =3D 10; + + card->driver =3D &ubootnet; + grub_net_card_register (card); + } +} + +void +grub_ubootdisk_fini (void) +{ + struct grub_net_card *card, *next; + + FOR_NET_CARDS_SAFE (card, next)=20 + if (card->driver && grub_strcmp (card->driver->name, "ubnet") =3D=3D= 0) + grub_net_card_unregister (card); +} =3D=3D=3D modified file 'include/grub/uboot/uboot.h' --- include/grub/uboot/uboot.h 2013-04-07 00:41:07 +0000 +++ include/grub/uboot/uboot.h 2013-04-09 22:21:07 +0000 @@ -100,19 +100,19 @@ /* * int API_dev_enum(struct device_info *) */ -int uboot_dev_enum (void); +int EXPORT_FUNC(uboot_dev_enum) (void); =20 -struct device_info *uboot_dev_get (int handle); +struct device_info *EXPORT_FUNC(uboot_dev_get) (int handle); =20 /* * int API_dev_open(struct device_info *) */ -int uboot_dev_open (int handle); +int EXPORT_FUNC(uboot_dev_open) (int handle); =20 /* * int API_dev_close(struct device_info *) */ -int uboot_dev_close (int handle); +int EXPORT_FUNC(uboot_dev_close) (int handle); =20 /* * Notice: this is for sending network packets only, as U-Boot does not @@ -134,8 +134,8 @@ int uboot_dev_read (int handle, void *buf, lbasize_t blocks, lbastart_t start, lbasize_t * real_blocks); =20 -int uboot_dev_recv (int handle, void *buf, int size, int *real_size); -int uboot_dev_send (int handle, void *buf, int size); +int EXPORT_FUNC(uboot_dev_recv) (int handle, void *buf, int size, int *r= eal_size); +int EXPORT_FUNC(uboot_dev_send) (int handle, void *buf, int size); =20 /* * int API_env_get(const char *name, char **value) --------------040908010002010208010505-- --------------enigFAB92802FECFB8EC5EC1502F Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iF4EAREKAAYFAlFkoewACgkQNak7dOguQgmOAgD+MDmWkazG6jr9j+aaPXO07Vkn Nw/hX/rhoP4hnIOQgBgBAKtQX8OjLCOuaa13DB3H1b0nSlTbq7rxCD6cs7H8l55k =Wt0t -----END PGP SIGNATURE----- --------------enigFAB92802FECFB8EC5EC1502F--